辞書 とは
辞書とは、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 // [:]
配列ではいろいろなメソッドを使用しましたが、
辞書では、代入演算子で全て解決できるので楽ですね!
以上、最後までご覧いただきありがとうございました。
↧