【Swift】配列の使い方。インデックス番号をつけたデータの集まり。(Swift 2.1、XCode 7.2)
配列を作る
配列とは、複数のデータを1つの変数で管理できる入れ物のことをいう。
データを入れるための箱が番号付きで並べられていて、その中にデータを入れていくイメージである。箱の中に入れたデータを差し替えたり、箱を追加、削除することもできる。
「タプル」は一度作ったらデータの追加、削除はできないが、「配列」ではそのあたりが柔軟にできる。なので、タプルは一度きりのデータセットの受け渡しに使い、配列は常にデータが変化する集合体の管理に使うといった使い分けが適している。ただし、var(変数)で宣言した配列は要素の変更が可能だが、let(定数)で宣言した配列は変更できない。
配列は以下のコードのように[値, 値, 値,…]で作る。型を指定しなければ、型の種類を混在させて格納できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//配列を作る var test1 = ["山田", "中野", 12] print(test1) //実行結果 //[山田, 中野, 12] //別の書き方 var test2:Array = ["山田", "中野",12] print(test2) //実行結果 //[山田, 中野, 12] |
以下のコードのように型を指定して配列を作れば格納するデータを制限できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//配列に入れる型を指定して宣言する var test3:[String] = ["山田", "中野", "今田"] print(test3) //実行結果 //["山田", "中野", "今田"] //別の書き方 var test4:Array<String> = ["山田", "中野", "今田"] print(test4) //実行結果 //["山田", "中野", "今田"] //指定していない型の値を入れようとするとエラーになる var test5:[String] = ["山田", "中野", 12] //実行結果 //error: cannot convert value of type 'Int' to expected element type 'String' |
空の配列を作るには以下のコードようにする。上記コードでは左辺に書いていた型の指定を右辺で書くことになるので混乱する。
1 2 3 4 5 6 7 8 9 |
//String型の空の配列を作る var test6 = [String]() var test7 = Array<String>() //型を指定しない空の配列を作る var test8 = [AnyObject]() var test9 = Array<AnyObject>() |
配列の要素を取得する
配列の要素の値を参照するには、以下のコードのようにする。first, lastのプロパティで取得した場合はオプショナル型変数として要素が取得されるので、配列が空の場合はnilが戻る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//4番目の要素を取得する var hairetsu:[String] = ["A", "B", "C", "D", "E", "F"] print(hairetsu[3]) //実行結果 //D //最初の要素を取得する print(hairetsu.first!) //実行結果 //A //最後の要素を取得する print(hairetsu.last!) //実行結果 //F |
その他、配列の情報を知るプロパティには以下のようなものがある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var hairetsu2:[String] = ["A", "B", "C"] hairetsu2.removeLast() //配列が空かチェック true print(hairetsu2.isEmpty) //配列の要素数を取得 2 print(hairetsu2.count) //配列のメモリ空間から取得した要素数 3 print(hairetsu2.capacity) //配列の中身を表示 print(hairetsu2.description) print(hairetsu2.debugDescription) |
配列の要素を1つずつ取得しながら、要素数ぶんループするにはfor-in文を使って以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//配列の要素数ぶんループする。 var hairetsu4 = [100, 500, 300, 200, 400] for test17 in hairetsu4 { print(test17) } //実行結果 //100 //500 //300 //200 //400 |
配列を操作する
配列の後ろに要素を追加するには以下のメソッドを用いる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* **【メソッド】append、appendContentsOf **【説明】配列の後ろに要素を追加する。 */ //配列の後ろに要素を1つ追加する。 var test10:[String] = ["A", "B", "C"] test10.append("D") print(test10) //実行結果 //["A", "B", "C", "D"] //配列の後ろに別のコレクションを追加する。 var test11:[String] = ["E", "F", "G"] test10.appendContentsOf(test11) print(test10) //実行結果 //["A", "B", "C", "D", "E", "F", "G"] //2つの配列を結合するのは「+演算子」でもできる var hairetsu2:[String] = ["A", "B", "C"] var hairetsu3:[String] = ["D", "E", "F"] hairetsu2 = hairetsu2 + hairetsu3 print(hairetsu2) //実行結果 //["A", "B", "C", "D", "E", "F"] |
以下のコードは、空の配列を作ったあとにループ処理で要素を追加していく使用例
1 2 3 4 5 6 7 8 |
var test12 = [Int]() for i in 1 ... 10 { test12.append(i) } print(test12) |
配列の任意の位置に要素を挿入するには以下のメソッドを使用する。引数いは追加する要素とインデックス番号を与える。インデックス番号は0から始まるので注意すること。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* **【メソッド】insert、insertContentsOf **【説明】任意の位置に要素を挿入する */ //配列の2番目に要素を挿入する var test12:[String] = ["A", "E"] test12.insert("B", atIndex:1) print(test12) //実行結果 //["A", "B", "E"] //配列の3番目に別のコレクションを挿入する var test13:[String] = ["C", "D"] test12.insertContentsOf(test13, at: 2) print(test12) //実行結果 //["A", "B", "C", "D", "E"] |
配列の要素を削除するには以下のメソッドを使用する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* **【メソッド】removeFirst, removeLast, removeAtIndex,removeRange **【説明】配列から要素を削除する */ //配列の最初の要素を削除する var test14:[String] = ["A", "B", "C", "D", "E", "F"] test14.removeFirst() print(test14) //実行結果 //["B", "C", "D", "E", "F"] //配列の最後の要素を削除する test14.removeLast() print(test14) //実行結果 //["B", "C", "D", "E"] //配列の3番目の要素を削除する test14.removeAtIndex(2) print(test14) //実行結果 //["B", "C", "E"] //配列の2番目から3番目の要素を削除する test14.removeRange(1...2) print(test14) //実行結果 //["B"] |
配列のすべての要素を削除するには以下のメソッドを用いる。データ追加時に取得したメモリ空間は残しておく場合は引数にtrueを与える。
性能にどれだけ効果があるのかは未確認だが、削除、追加を繰り返す場合はメモリ空間を残しておいたほうが余計なメモリ取得処理が行われないのでスマートだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* **【メソッド】removeAll **【説明】配列のすべての要素を削除する。 */ //配列のすべての要素を削除する。 var test15:[String] = ["G", "T", "O", "K", "E", "N"] test15.removeAll() print(test15.capacity) //取得したメモリ空間は残して、配列のすべての要素を削除する。 var test16:[String] = ["G", "T", "O", "K", "E", "N"] test16.removeAll(keepCapacity: true) print(test16.capacity) |