Swiftは、配列、セット、および辞書の3つのコレクションタイプを提供します。配列は、順序付けられた値のコレクションです。セットは、一意の値の順序付けられていないコレクションです。辞書は、キーと値の関連付けの順序付けられていないコレクションです。
![../_images/CollectionTypes_intro_2x.png](https://docs.swift.org/swift-book/_images/CollectionTypes_intro_2x.png)
コレクションの可変性
配列、セット、または辞書を作成し、それを変数に割り当てると、作成されるコレクションは変更可能になります。コレクションを変更する必要がない場合に、let による不変コレクションを作成することを勧める。そうすることで、コードを推論しやすくなり、コンパイラーがパフォーマンスを最適化できる。
配列
配列の順序付きリスト内の同じタイプの値を格納する。NSArrayに橋渡しされている。
配列型の省略構文
Array<Element>
ここで、Element
は、配列に格納できる値のタイプ。
省略形:[Element]
空の配列の作成
初期化構文を使用して、特定のタイプの空の配列を作成できる。
var someInts = [Int]()
デフォルト値を持つ配列の作成
すべての値が同じデフォルト値で、特定のサイズの配列の作成。
var threeDoubles = Array(repeating: 0.0, count: 3) // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
2つの配列を一緒に追加して配列を作成する
加算演算子(+
)を使用して、互換性のあるタイプの2つの既存の配列を加算することにより、新しい配列を作成できます。新しい配列のタイプは、一緒に追加する2つの配列のタイプから推測されます。
var anotherThreeDoubles = Array(repeating: 2.5, count: 3) // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5] var sixDoubles = threeDoubles + anotherThreeDoubles // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
配列リテラルを使用した配列の作成
また、配列リテラルで配列を初期化することもできます。これは、1つ以上の値を配列コレクションとして書き込むための簡単な方法です。配列リテラルは、コンマで区切られた値のリストとして記述され、角括弧のペアで囲まれます。
[value 1, value 2, value 3] // 例 var shoppingList: [String] = ["Eggs", "Milk"] // shoppingList has been initialized with two initial items // 型推論により、次のように記述できる。 var shoppingList = ["Eggs", "Milk"]
配列へのアクセスと変更
メソッドとプロパティを介して、または添字構文を使用して、配列にアクセスして変更します。
// 配列内のアイテム数には、読み取り専用countプロパティ print("The shopping list contains \(shoppingList.count) items.") // 配列が空かどうかは、isEmpty プロパティ if shoppingList.isEmpty { print("The shopping list is empty.") } else { print("The shopping list is not empty.") } // 配列の最後に新しいアイテムを追加 shoppingList.append("Flour") // 追加の代入演算子 += 1つ以上の互換性のあるアイテムの配列を追加 shoppingList += ["Baking Powder"] shoppingList += ["Chocolate Spread", "Cheese", "Butter"] // インデックス // 配列の最初の項目のインデックスは0 var firstItem = shoppingList[0] // 特定のインデックスにある既存の値を変更 shoppingList[0] = "Six eggs" // 次はランタイムエラー shoppingList[shoppingList.count] = "Salt" // 配列の長さが置換する長さと異なっていても、一度に変更できる。 // 次の場合は、"Baking Powder", "ChocolateSpread", "Cheese", "Butter", "Bananas", "Apples" となる。 shoppingList[4...6] = ["Bananas", "Apples"] // 配列の指定したインデックスにアイテムを挿入 shoppingList.insert("Maple Syrup", at: 0) // 指定されたインデックスにある項目を削除し、削除された項目を返す let mapleSyrup = shoppingList.remove(at: 0) // 最初のアイテム firstItem = shoppingList[0] // 配列から最後の項目を削除する場合 // 配列のcountプロパティを確認する必要がない let apples = shoppingList.removeLast()
配列の反復
for
– in
ループを使用して、配列内の値のセット全体を反復処理できます。
for item in shoppingList { print(item) } // 各アイテムの整数インデックスとその値が必要な場合はenumerated() for (index, value) in shoppingList.enumerated() { print("Item \(index + 1): \(value)") }
セット
一意の値の順序付けられていないコレクション。
アイテムの順序が重要ではない場合、またはアイテムが1回だけ表示されるようにする必要がある場合は、配列の代わりにセットを使用できます。NSSetに橋渡しされている。
セット型のハッシュ値
セットに格納するためには、hashable型である必要がある。
String, Int, Double, Boolなどの基本的なタイプは、デフォルトでハッシュ可能であり、セットの値の型または辞書のキータイプとして使用することができる。関連する値のない列挙型のケース値も、デフォルトでハッシュ可能。
タイプ構文の設定
Set<Element>
配列とは異なり、セットには省略形はありません。
空のセットの作成と初期化
// 初期化構文 var letters = Set<Character>() // 挿入 letters.insert("a") // 空のセット letters = []
配列リテラルを使用したセットの作成
// 配列リテラルでセットを初期化 var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"] // 1つの型のみの配列リテラルで初期化する場合は、型は必要はありません var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
セットへのアクセスと変更
// アイテム数 print("I have \(favoriteGenres.count) favorite music genres.") // 空かどうか if favoriteGenres.isEmpty { print("空のセットです") } // 新しいアイテムをセットに追加 favoriteGenres.insert("Jazz") // セットからアイテムを削除 // 削除された値を返す if let removedGenre = favoriteGenres.remove("Rock") { print("\(removedGenre)? I'm over it.") } else { print("I never much cared for that.") } // セットに特定のアイテムが含まれているかどうかを確認 favoriteGenres.contains("Funk")
セットの反復
// for- inループを使用すると、セットの値を反復処理 for genre in favoriteGenres { print("\(genre)") } // 特定の順序でセットの値を反復処理 for genre in favoriteGenres.sorted() { print("\(genre)") }
集合演算の実行
基本セット演算
let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] oddDigits.union(evenDigits).sorted() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] oddDigits.intersection(evenDigits).sorted() // [] oddDigits.subtracting(singleDigitPrimeNumbers).sorted() // [1, 9] oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() // [1, 2, 9]
メンバーシップと平等を設定する
- 「等しい」演算子(
==
)を使用して、2つのセットに同じ値がすべて含まれているかどうかを判断します。 isSubset(of:)
メソッドを使用して、セットのすべての値が指定されたセットに含まれているかどうかを判別します。isSuperset(of:)
メソッドを使用して、指定したセットのすべての値がセットに含まれているかどうかを確認します。isStrictSubset(of:)
orisStrictSuperset(of:)
メソッドを使用して、セットがサブセットであるかスーパーセットであるかを指定しますが、指定されたセットとは異なります。isDisjoint(with:)
メソッドを使用して、2つのセットに共通の値がないかどうかを判別します。
let houseAnimals: Set = ["🐶", "🐱"] let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"] let cityAnimals: Set = ["🐦", "🐭"] houseAnimals.isSubset(of: farmAnimals) // true farmAnimals.isSuperset(of: houseAnimals) // true farmAnimals.isDisjoint(with: cityAnimals) // true
辞書
辞書は、同じ型のキーと同じ型の値の関連を、順序なしコレクションとして格納します。各値は一意のキーに関連づけられる。NSDictionaryクラスに橋渡されている。
辞書型の短縮構文
Dictionary<Key, Value>KeyValue
省略形: [Key: Value]
KeyはHashable
空の辞書を作成する
// 特定のタイプの空の辞書 var namesOfIntegers = [Int: String]() // 1つのキー値ペアを作成 namesOfIntegers[16] = "sixteen" // 空のディクショナリ namesOfIntegers = [:]
辞書リテラルを使用した辞書の作成
辞書リテラルで辞書を初期化することもできます。これは、前に見た配列リテラルと同様の構文です。辞書リテラルは、1つ以上のキーと値のペアをDictionary
コレクションとして記述するための簡単な方法です。
// 国際空港の名前を格納する辞書 var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] // キーと値の型が一致する辞書リテラルで辞書を初期化する場合、型を記述する必要はありません var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
辞書へのアクセスと変更
// アイテム数 airports.count // 空かどうか airports.isEmpty // 追加 airports["LHR"] = "London // 変更 airports["LHR"] = "London Heathrow" // 特定のキーの値を設定・更新 // すでにキーが存在する場合、古い値を返す // 存在しない場合、nil を返す if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") { print("The old value for DUB was \(oldValue).") } // 特定のキーのディクショナリから値を取得 // すでにキーが存在する場合、値を返す // 存在しない場合、nil を返す if let airportName = airports["DUB"] { print("The name of the airport is \(airportName).") } // キーに値を設定 airports["APL"] = "Apple International" // 値を削除 airports["APL"] = nil // キーと値のペアを削除 // 削除された値を返す // 存在しない場合、nil を返す if let removedValue = airports.removeValue(forKey: "DUB") { print("The removed airport's name is \(removedValue).") }
辞書の反復
for
– in
ループを使用して、ディクショナリ内のキーと値のペアを反復できます。ディクショナリ内の各アイテムはタプルとして返され、反復の一部としてタプルのメンバーを一時的な定数または変数に分解できます。(key, value)
// for- inループを使用して、ディクショナリ内のキーと値のペアを反復 // 各アイテムはタプルとして返される for (airportCode, airportName) in airports { print("\(airportCode): \(airportName)") } // keys プロパティにアクセス for airportCode in airports.keys { print("Airport code: \(airportCode)") } // values プロパティにアクセス for airportName in airports.values { print("Airport name: \(airportName)") } // keys プロパティでアクセス let airportCodes = [String](airports.keys) // airportCodes is ["LHR", "YYZ"] // values プロパティでアクセス let airportNames = [String](airports.values) // airportNames is ["London Heathrow", "Toronto Pearson"]
Dictionary
型には順序が定義されていません。ディクショナリのキーまたは値を特定の順序で反復するには、そのkeys
or values
プロパティへのsorted()
メソッドを使用します。