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