(2020/05/02 更新)
配列(Array)の使い方について解説します。
Swiftでは配列に格納できる要素の数に制限はなく、自由に格納したり取り出したりできます。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.2
配列の作成
一般的な配列の作成例です。
配列の型は中に入れる値の内容によって自動的に推論されます。但し、ある配列に格納される値の型は同じでなければいけません。
1 2 3 4 5 |
let oddNumbers = [1, 3, 5, 7, 9] // 整数(Int)の配列 let fruits = ["apple", "orange", "banana"] // 文字列(String)の配列 |
データ型を明示的に指定するには次のように記述します。
1 2 3 4 5 |
let oddNumbers: [Int] = [1, 3, 5, 7, 9] // 整数(Int)の配列 let fruits: [String] = ["apple", "orange", "banana"] // 文字列(String)の配列 |
空の配列を作成
空の配列の作成方法は次のようにします。
2種類ありますが、どちらの書き方でもOKです。
値が無い為、データ型の自動設定は行なえません。データ型の指定が必須となります。
1 2 3 4 5 |
var emptyString: [String] = [] // String型の空配列 var emptyDouble = [Double]() // Double型の空配列 |
デフォルト値で初期化
デフォルト値で初期化された配列の作成方法です。
次の例は0で初期化された10個の配列を作成します。
1 2 3 |
var values = Array(repeating: 0, count: 10) // [0,0,0,0,0,0,0,0,0,0] |
文字列を配列に変換する
文字列を1文字つづの配列に変換できます。
1 2 3 4 |
let letter = Array("Apple") print(letter) // ["A", "p", "p", "l", "e"] |
配列へのアクセス
配列の各要素にアクセスするには、次のように[ ]の中に添字を入れて指定します。添字は0から始まる整数です。
添字無し配列名をprint()に渡すと、配列の内容が丸ごと出力されるので、デバッグ時に配列の中身を確認するのに便利です。
1 2 3 4 5 6 7 8 9 10 11 |
var values = ["A", "B", "C", "D", "E"] print(values[0]) // "A" が表示される print(values[3]) // "D" が表示される values[4] = "X" // 値の置き換え print(values) // ["A", "B", "C", "D", "X"] が表示される |
配列の最初と最後の要素に安全にアクセスするには、.firstと.lastのプロパティを使用します。
配列が空の場合、これらのプロパティはnilを返します。
1 2 3 4 5 6 |
var values = ["A", "B", "C", "D", "E"] print(values.first!) // "A" が表示される print(values.last!) // "E" が表示される |
配列の全ての要素にアクセスするには、次のようにfor-inループを使用して繰り返し処理します。
1 2 3 4 5 6 7 8 9 10 11 |
let fruits = ["apple", "orange", "banana"] // 文字列の配列 for value in fruits { print("I like \(value).") } // I like apple. // I like orange. // I like banana. |
要素数を調べる
countプロパティで配列の要素数を調べられます。
1 2 3 4 5 |
let oddNumbers = [1,3,5,7,9] print(oddNumbers.count) // 要素数の5が表示される |
要素の追加
append() メソッドで配列の最後に要素を追加できます。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.append("D") // 配列の最後に追加 print(values) // ["A", "B", "C", "D"] |
append(contentsOf:)で複数の要素をまとめて追加できます。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.append(contentsOf: ["D", "E"]) // 配列の最後に追加 print(values) // ["A", "B", "C", "D", "E"] |
演算子+、または+=を使うと、もっと簡単に要素を追加できます。
1 2 3 4 5 6 7 8 9 10 11 |
var values = ["A", "B", "C"] let foo = values + ["D", "E"] print(foo) // ["A", "B", "C", "D", "E"] values += ["X", "Y"] print(values) // ["A", "B", "C", "X", "Y"] |
insert(_: at:)メソッドで、任意の位置に要素を挿入可能です。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.insert("D", at: 2) // 要素番号2の位置に挿入 print(values) // ["A", "B", "D", "C"] |
複数の要素をまとめて挿入するには、insert(contentsOf: at:)メソッドを使います。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.insert(contentsOf: ["X", "Y"], at: 2) print(values) // ["A", "B", "X", "Y", "C"] |
要素の削除
任意の要素を削除する場合は、remove(at:)メソッドを使います。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.remove(at: 1) // 要素番号1を削除 print(values) // ["A", "C"] |
removeAll()メソッドで全ての要素を削除します。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C"] values.removeAll() // 全ての要素を削除 print(values) // [] (空の配列) |
要素の並べ替え
sort()メソッドで配列の要素を昇順にソートします。
1 2 3 4 5 6 7 |
var values = ["B", "C", "A", "D"] values.sort() // 配列を昇順にソート print(values) // ["A", "B", "C", "D"] |
sort(by: {$0 > $1})メソッドで配列の要素を降順にソートします。
1 2 3 4 5 6 7 |
var values = ["B", "C", "A", "D"] values.sort(by: {$0 > $1}) // 配列を降順にソート print(values) // ["D", "C", "B", "A"] |
reverse()メソッドで、要素の順番を反転させます。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C", "D"] values.reverse() // 要素の順番を反転 print(values) // ["D", "C", "B", "A"] |
shuffle()メソッドで、要素をランダムに並べ替えます。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C", "D"] values.shuffle() // 要素をランダムに並べ替え print(values) // ["*", "*", "*", "*"] |
要素の検索
contains()メソッドで、指定した要素が配列に含まれているか否かをBool値で返します。
1 2 3 4 5 6 7 |
let fruits = ["apple", "orange", "banana"] // 文字列の配列 /// 要素が含まれているか否か? print(fruits.contains("orange")) // true print(fruits.contains("peach")) // false |
firstIndex(of:)メソッドでは、指定した要素が現れる最初の要素番号を返します。
見つからない場合はnilを返します。
1 2 3 4 5 6 7 8 9 10 |
let fruits = ["apple", "orange", "banana"] // 文字列の配列 /// 指定した要素が現れる最初の要素番号を返す if let index = fruits.firstIndex(of: "orange") { print(index) // 1 } else { /// 指定した要素が見つからない } |
firstIndex(where:) メソッドでは、条件に合う最初の「要素番号」を、
first(where:)メソッドでは、条件に合う最初の「要素」を返します。
条件はクロージャーで定義し、見つからない場合はnilを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
let fruits = ["apple", "orange", "banana"] // 文字列の配列 /// 条件に合う最初の要素番号を返す(文字数が5文字より多いもの) if let index = fruits.firstIndex(where: {$0.count > 5}) { print(index) // 1 } else { /// 条件に合う要素が見つからない } /// 条件に合う最初の要素を返す(文字数が5文字より多いもの) if let value = fruits.first(where: {$0.count > 5}) { print(value) // "orange" } else { /// 条件に合う要素が見つからない } |
要素の絞り込み
filterメソッドで、条件にマッチした要素のみに絞り込む事ができます。
条件はクロージャーで定義し、見つからない場合は空の配列を返します。
1 2 3 4 5 6 7 8 |
let fruits = ["apple", "orange", "banana"] // 文字列の配列 ///条件にあう要素だけ抽出する(文字数が5文字よりも多いもの) let newArray = fruits.filter{ $0.count > 5} print(newArray) // ["orange", "banana"] |
ランダムな要素を返す
randomElement()で、ランダムに要素を返します。
要素が1つもない場合はnilが返ります。
1 2 3 4 5 6 7 |
var values = ["A", "B", "C", "D"] print(values.randomElement() ?? "") // "B" print(values.randomElement() ?? "") // "C" print(values.randomElement() ?? "") // "C" |
まとめ
配列については、ここに紹介した以外にもいろいろな操作が用意されています。
もっと詳しく知りたい方はSwiftのリファレンスを参照してみて下さい。