Quantcast
Channel: dictionaryタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 99

【Swift】コレクションについて〜辞書〜

$
0
0
辞書 とは 辞書とは、Dictionary<Key, Value>型というキーと値のペアを持つコレクションになります。 このコレクションは、キーを元に値にアクセスする用途で使用します。 Array<Element>型と同様に、Dictionary<Key, Value>型のKeyとValueは、 プレースホルダ型となっております。 実際にはDictionary<String, Int>型のように Key型とValue型に具体的な型を指定して使用します。 記述の方法は、Array<Element>型と似た感じで、[Key: Value]の形で記述します。 また、カンマで区切ることによって、 配列のように複数のキーと値を変数や定数に入れることができます。 let dictonary = ["a": 1, "b": 2] 辞書にも型推論があり、今回の場合ですと[String: Int]型になります。 要素が一つも存在しない場合や、キーや値に複数の方が混在する場合には、 型推論ができないことがあります。 そういった場合は、明示的に型を宣言する必要があります。 let dictionary: [String: Int] = [:] // 空の辞書 KeyとValueに入れれる型 配列の場合はどんな型でも配列を作ることができましたが、 Dictionary<Key, Value>型の場合は少し制限があります。 Key型には型の制限が存在し、Key型に入れることができる型は、 Hashableプロトコルに準拠している型でないといけないらしいです。 私も記事を書くまで知りませんでした・・・。 Hashableプロトコルに準拠している型はString型やInt型があります。 例えば、String型の値"a"のハッシュ値は4799450059485595655、 Int型の値1のハッシュ値は1らしいです。 現在は実行ごとに異なるハッシュ値が適用されるらしいです。  ハッシュ値を特定の形でプログラムが理解できないと、 どの値を取り出せばいいのかわからなくなるからでしょうか。 一方で、Value型には型の制限が存在しません。 なのでこの様な辞書も作成できます。 // [String, [Int]]型 教科(キー)と点数の配列(値)の辞書 let a = ["math": [50, 33, 13, 100], "English": [91, 80, 22, 12]] 他にも、[String: [String: Int]]型なども作ることも可能です。 こんなの作るとややこしそうですね(笑) 当たり前ですが、明示的に宣言された型と異なる型を代入するとコンパイルエラーになります。 一つ目は、Value型がInt型なのに、String型が代入されてエラー 二つ目は、Key型がString型なのに、Int型が代入されてエラー let a: [String: Int] = ["a": "b"] // コンパイルエラー let b: [String: Int] = [1: 2] // コンパイルエラー Dictionary<Key, Value>型の操作 値へのアクセス方法は配列と似ており、サブスクリプトを使い値を取り出します。 配列の場合は、サブスクリプトの引数にインデックスを指定していましたが、 辞書の場合は、サブスクリプトの引数にKey値を指定します。 let dictionary = ["key": 1] // [String: Int]型 let value = dictionary["key"] // Optional(1) Dictionary<Key,Value>型は、Array<Element>型と違い、 存在しない値にアクセスしても実行時エラーにはならずnilが返ります。 そのため、値が存在したとしても返ってくる型はOptional<Weapped>型になります。 値の更新、追加、削除 Dictionary<Key,Value>型の値の更新、追加、削除にもサブスクリプトを使用します。 サブスクリプトの引数にKey型の値を指定し、代入演算子を用いて変更を行います。 // 更新 let dictionary1 = ["key": 1] dictionary1["key"] = 2 dictionary1 // ["key": 2] // 追加 let dictionary2 = ["key1": 1] dictionary2["key2"] = 2 dictionary2 // ["key1": 1, "key2": 2] // 削除 let dictionary3 = ["key": 1] dictionary3["key"] = nil dictionary3 // [:] 配列ではいろいろなメソッドを使用しましたが、 辞書では、代入演算子で全て解決できるので楽ですね! 以上、最後までご覧いただきありがとうございました。

Viewing all articles
Browse latest Browse all 99

Trending Articles