NOTE コレクションの変更が必要ない場合は、不変なコレクションを作成するのが良いプラクティスです。そうすることで、コードを理解しやすくし、Swift のコンパイラもコレクションのパフォーマンスを最適化することができます。
NOTEArray
は Foundation のNSArray
とスムーズにやりとりできるようにしています。Foundation と Cocoa を使ったArray
の使用方法に関しては、Bridging Between Array and NSArrayを参照ください
Array<Element>
と書きます。Element
はその配列が保持できる値の型です。簡略記法として [Element]
とも書けます。この 2 つの形式は機能的に同じですが、簡略記法の方が好まれ、このガイド内でも配列の型を参照する際はこちらの形式を使います。someInts
変数の型は、イニシャライザから [Int]
と推論されます。[]
(空の角括弧ペア)を使用して、空の配列を作成することができます。Array
は同じデフォルト値を設定した特定にサイズの配列を作成するイニシャライザも提供しています。このイニシャライザに適切な型のデフォルト値(repeating
)と、その値の繰り返し回数(count
)を渡します。+
)を使用して、既存の型互換のある 2 つの配列を合成して、新しい配列を作成することもできます。この新しい配列の型は連結させた配列の型から推論されます:[]
)で囲んだ値のリストです:String
を保持する shoppingList
という配列を作成しています。shoppingList
変数は、[String]
と書くことで「文字列を保持する配列」として宣言されています。この配列は値の型が String
で特定されているので、String
のみを保持することができます。ここで、shoppingList
配列は、配列リテラルの中で "Eggs"
と "Milk"
の 2 つの値で初期化しています。NOTE 後の例でさらにアイテムを追加するので、shoppingList
配列はlet
で宣言された定数ではなく、var
で変数として宣言されてます。
String
を含んでいます。これは shoppingList
変数の宣言時の型(String
しか含めない)に合致しているので、shoppingList
に配列リテラルを代入して 2 つに初期値で初期化することができます。shoppingList
の例の初期化は、より簡潔な方法で書くことができました:shoppingList
変数で使われている型は [String]
が適切だと推論できます。count
プロパティをチェックします。Bool
型の isEmpty
プロパティは、count
プロパティが 0
かどうかをチェックする簡略記法です。append(_:)
メソッドを使用して、配列の末尾に新しいアイテムを追加することができます。+=
)を使用して 1 つ以上の互換性のある型のアイテムを追加することもできます。[]
)の中に、取得したい値のインデックスを渡します。NOTE 配列の最初のアイテムのindexは0
であって1
ではありません。SwiftのArrayはいつも 0 から始まるインデックス方式です。
shoppingList[shoppingList.count] = "Salt"
と書くと、実行時エラーになります。"Chocolate Spread"
、"Cheese"
、"Butter"
を "Bananas"
、"Apples"
に置き換えています。insert(_:at:)
メソッドを使います。insert(_:at:)
に "Maple Syrup"
とインデックス 0 を指定して、ショッピングリストの先頭に新しいアイテムを挿入しています。remove(at:)
を使用して配列からアイテムを削除できます。このメソッドは特定のインデックスのアイテムを削除し、削除したアイテムを返します(必要なければ戻り値は無視できます):NOTE 配列の既存の境界を超えたインデックスの値にアクセスしたり、変更したりしようとすると、実行時エラーになるでしょう。count
プロパティとインデックスを比較して、インデックスが妥当かどうかをチェックしてください。配列は 0 から始まるインデックス方式なので、妥当な最大のインデックスはcount - 1
です。しかし、count
が0
のとき(配列が空のとき)、妥当なインデックスは存在しません。
0
の値は再び "Six eggs"
になります。count
プロパティを探すコストを避けるためには、remove(at:)
よりも removeLast()
を使います。remove(at:)
と同様に removeLast()
も削除したアイテムを返します:for-in
ループを使用して配列の値全部に繰り返し処理をすることができます。enumerated()
を代わりに使いましょう。enumerated()
は数値のインデックスとアイテムを組み合わせたタプルを返します。数値の開始は 0
で、1
ずつ増加していきます。つまり全体を繰り返し処理すると、数値はアイテムのインデックスと一致します。繰り返し処理の中で、インデックスとアイテムのタプルを一時的な定数や変数に展開することができます。Set
は Foundation のNSSet
とスムーズにやりとりできるようにしています。Foundation と Cocoa を使ったSet
の使用方法に関しては、Bridging Between Set and NSSetを参照ください
Int
型で、等価比較が可能な全てのオブジェクトで、例えば a == b
の場合、a
のハッシュ値は b
のハッシュ値と等しくなります。String
、Int
、Double
、Bool
など)は、デフォルトでハッシュ化が可能で、セットや辞書のキーに使用することができます。関連値を持たない列挙型のケース(Enumerations(列挙型))もデフォルトでハッシュ化が可能です。NOTE Swift 標準ライブラリのHashable
プロトコルに準拠することで、独自で作成した型をセットや辞書のキーに使用できます。hash(into:)
メソッドの実装については、Hashableを参照ください。プロトコルの準拠については、Protocols(プロトコル)を参照ください。
Set<Element>
と書きます。Element
はセットが保持できる型です。セットには、配列のような簡略記法([Element]
)はありません。NOTEletters
変数の型はイニシャライザの型からSet<Character>
と推論されます。
favoriteGenres
という String
の値を保持するセットを作成しています。favoriteGenres
変数は Set<String>
と書くことで、「String
のセット」を宣言しています。String
型の値を保持しているため、このセットには String
しか保持できません。ここでは favoriteGenres
セットに 3 つの String
を含めた配列リテラルを使用して初期化しています。NOTE 後の例でアイテムの追加や削除を行なっているため、favoriteGenres
は定数ではなく変数で定義されています。
Set
を明示しなければなりません。しかし、Swift の型推論によって、1 つの型しか持たない配列リテラルの場合は、要素の型を書かなくても初期化できます。favoriteGenres
の初期化は下記のようにより簡単に書くことができました:favoriteGenres
変数は Set<String>
が正しい型だと推論できます。count
プロパティをチェックします。Bool
型の isEmpty
プロパティは、count
プロパティが 0
かどうかをチェックする簡略記法です。insert(_:)
メソッドを使用して、セットに新しいアイテムを追加することができます。remove(_:)
を使用してセットからアイテムを削除できます。セットにアイテムが存在した場合は削除し、削除したアイテムを返します。もし存在しなけば nil
を返します。他の方法として、全アイテムを削除するには removeAll()
を使います。contains(_:)
メソッドを使用することができます。for-in
ループを使用してセットの要素を繰り返し処理することができます。sorted()
メソッドを使用すると、<
演算子を使用してソートされた配列として要素を返します。a
と b
の 2 つのセットに対して、それぞれ操作を行い、色の付いた部分が結果(戻り値)を表しています。intersection(_:)
は、2 つのセットの共通要素を含めた新しいセットを作成しますsymmetricDifference(_:)
は、どちらかのセットにあるものの、両方には含まれていない要素を含めた新しいセットを作成しますunion(_:)
は、両方のセットに含まれている全ての要素を含めた新しいセットを作成しますsubtracting(_:)
は、特定のセットには含まれていない要素を含めた新しいセットを作成しますa
、b
、c
の 3 つのセットで共有している要素の領域を表しています。 a
は、b
に含まれる全ての要素を含んでいるため、b
の_上位集合_です。反対に、b
は a
の_下位集合_です。b
と c
は、共通の要素がないため、互いに_素_です。==
)を使用して、2 つのセットの要素が全て同じかどうかを判定できますisSubset(of:)
を使用してあるセットの要素が他のセットに全て含まれているかどうかを判定できますisSuperset(of:)
を使用してあるセットが他のセットの全ての要素を含んでいるかどうかを判定できますisStrictSubset(of:)
や isStrictSuperset(of:)
は、あるセットが他のセットの上位集合か下位集合かどうかを判定できます(等しい場合は false
です)isDisjoint(with:)
は 2 つのセットに共通要素が全くないかどうかを判定できますNOTEDictionary
は Foundation のNSDictionary
とスムーズにやりとりできるようにしています。Foundation と Cocoa を使ったDictionary
の使用方法に関しては、Bridging Between Dictionary and NSDictionaryを参照ください
Dictionary<Key, Value>
と書きます。Key
には辞書のキーとして使える値の型を、Value
にはそのキーに紐づいた辞書で保持するバリューの型です。NOTE 辞書のKey
はセットの値のように、Hashable
プロトコルに準拠しなければなりません。
[Key: Value]
と簡略記法で書くこともできます。機能的にはどちらの書き方も同じですが、簡略記法の方が好ましく、このガイド内では、辞書の型を参照する際はこちらの形式を使います。Dictionary
をイニシャライザの構文を使用して作成できます。[Int: String]
型の空の辞書を作成しています。キーは Int
型でバリューは String
型です。[:]
と書くことができます。(角括弧([]
)の中にコロン(:
)):Dictionary
のコレクションを作成する簡略記法です。:
)で分けます。複数のキーバリューペアは、カンマ(,
)区切りのリストを角括弧([]
)で囲みます:airports
辞書は、[String: String]
型と宣言され、「String
型のキーと String
型のバリューの Dictionary
」を意味します。NOTE 後の例でさらに空港を追加するため、airports
辞書は定数ではなく変数で定義されています。
airports
辞書は、2 つのキーバリューペアの辞書リテラルで初期化されています。最初のペアのキーは "YYZ"
、バリューは "Toronto Pearson"
、2 番目のペアのキーは "DUB"
、バリューは "Dublin"
です。String: String
型のペアを含んでいます。このキーバリューペアは airports
変数の宣言(String
型のキーと String
型のバリューしか持つことができない辞書)と一致するので、2 つの初期値を持つ airports
辞書を初期化するために、この辞書リテラルを代入することができます。airports
の初期化は、より簡潔に書くことができました:airports
辞書は [String: String]
が正しい型だと推論できます。Dictionary
のアイテムの数を調べるために、読み取り専用の count
プロパティをチェックします。Bool
型の isEmpty
プロパティは、count
プロパティが 0
かどうかをチェックする簡略記法です。+=
)を使用して 1 つ以上の互換性のある型のアイテムを追加できます。updateValue(_:forKey:)
メソッドを使用して、特定のキーのバリューの設定/更新ができます。subscript と同様に updateValue(_:forKey:)
は、特定のキーのバリューがなければ新しく値を設定し、既にバリューが存在していたら更新します。subscript と違う点として、updateValue(_:forKey:)
メソッドは、更新後に前の値を返します。こうすることで、更新が実際に起きたかどうかが確認できます。updateValue(_:forKey:)
メソッドは、辞書のバリューの型のオプショナル値を返します。例えば辞書が String
を保持している場合、このメソッドは String?
(オプショナル String
)を返します。このオプショナル値は更新前にバリューが存在していた場合はその値のオプショナルを返し、存在していなかった場合は nil
を返します:nil
を返します:nil
を代入することで、キーバリューペアを削除できます:removeValue(forKey:)
メソッドを使用してキーバリューペアを削除できます。バリューが存在すれば削除した値を返し、存在しなければ nil
を返します:for-in
ループを使用して辞書のキーバリューペア全部に繰り返し処理することができます。各アイテムは (key, value)
のタプルを返し、繰り返し処理の中で、このタプルを一時的な定数や変数に展開することができます。keys
と values
プロパティを使用して、キーとバリューそれぞれのリストを取得することもできます:Array
インスタンスを引数に受け取る API で辞書のキーとバリューを使いたい場合、keys
と values
プロパティを使用して新しい配列を初期化してください:Dictionary
型には決まった順序がありません。特定の順番で値を繰り返し処理をしたい場合、keys
か values
プロパティの sorted()
メソッドを使いましょう。