Dictionary型 -Swiftでキーバリュー型の値を扱う型

今回はSwiftのDictionary<Key, Value>型についてまとめていきます。
Dictionary<Key, Value>型はキーバリュー型の値を扱う型です。

キーバリュー型の値とは

キーバリュー型の値とは、キー(key)と値(value)のペアを持つコレクションのことで、キーを用いて値へのアクセスが行うことができます。
値の識別に利用されるキーは一意でなければなりませんが、値は重複しても問題ありません。
また、キーバリュー型のコレクションの要素には順序はありません。
つまり、Dictionary<Key, Value>型はこれらの特徴を持つ型となります。

Dictionary<Key, Value>型の定義

変数・定数の定義

Dictionary<Key, Value>型のKeyとValueには、StringやIntなどの具体的な型を指定して利用します。
Dictionary型の定義は以下のように行います。

// KeyがString型、ValueがInt型のDictionary型変数
var dict1: Dictionary<String, Int>

// KeyがInt型、ValueがBool型のDictionary型定数
let dict2: Dictionary<Int, Bool>

糖衣構文による定義

Dictionary<Key, Value>型には[Key : Value]という糖衣構文が用意されています。
糖衣構文を利用した定義は以下のように行います。

// KeyがString型、ValueがInt型のDictionary型変数
var dict1: [String : Int]

// KeyがInt型、ValueがBool型のDictionary型定数
let dict2: [Int : Bool]

Key・Valueに設定できる型

具体的な型を設定するKey・Valueですが、Keyに指定できる型には制限があります。
Keyに指定できる型はHashableプロトコルに準拠した型のみとなっています。
プロトコルとは規約などを表す言葉ですが、Swiftにおいてはクラスや構造体が保持するプロパティやメソッドなどの決まり事を定めるものを表します。
同じプロトコルに準拠した型は同じ決まり事に従って実装されることになります。
今回、Keyに利用されているHachableプロトコルは、その値を元にハッシュ値を算出できるという決まり事があります。
ハッシュ値とは、元の値を特定のアルゴリズムを用いてランダムな固定長の数値に変換した値のことです。
このハッシュ値への変換が可能なことによって、Keyの一意性の保証や探索が可能になるのです。
一方でValueにはどのような型でも指定することができます。

// Any型はHashableプロトコルに準拠していないためKeyに指定できない
var dict1: [Any : Int] // コンパイルエラー

// Valueにはどのような型も指定可能
let dict2: [Int : Any] // Any型のValue
let dict3: [String : [Int]] // Array<Int>型のValue

値の生成

辞書リテラル

Dictionary<Key, Value>型の値の生成は辞書リテラルを用いて行います。
辞書リテラルは[key1 : value1, key2: value2, key3: value3 … keyN: valueN]というように記述します。

// KeyがString型、ValueがInt型のDictionary型変数
var dict1: [String : Int]
//辞書リテラルによる値の生成
dict1 = ["key1": 1, "key2": 2, "key3": 3]

// KeyがInt型、ValueがBool型のDictionary型定数
let dict2: [Int : Bool]
//辞書リテラルによる値の生成
dict2 = [1: true, 2: false]

型推論

Dictionary<Key, Value>型はKeyとValueそれぞれの値の型から型推論をすることが可能です。

// KeyがString型、ValueがInt型のDictionary型変数
// 型推論による代入
var dict1 = ["key1": 1, "key2": 2, "key3": 3]

// KeyがInt型、ValueがBool型のDictionary型定数
// 型推論による代入
let dict2 = [1: true, 2: false]

型推論が不可能な空の辞書や複数の型のKeyやValueが混在する辞書の場合は型を明示する必要があります。
空の辞書リテラルは[:]と記述します。

// KeyがString型、ValueがInt型のDictionary型変数
// 型推論不可な空の辞書リテラルの代入
var dict1: [String : Int] = [:]

// KeyがAny型、ValueがAny型のDictionary型定数
// Valueが複数の型がある辞書リテラル
let dict2: [Int : Any] = [1: true, 2: "false"]

値の利用

値へのアクセス

Dictionary<Key, Value>型の値へのアクセスは下記のように記述します。

Dictionary<Key, Value>型の値[アクセスしたい値に対応するKey]

その際、存在しないKeyを指定した場合はエラーにならずnilが返却されます。
つまり、Dictionary<Key, Value>型から取得した値はOptional<Value>型となります。

let dict = ["key1": 1, "key2": 2]

// Keyを指定して値にアクセスする
let key1Value = dict["key1"] // Optional<Int>型の1
// 存在しないKeyの場合、nilが返却される
let noKeyValue = dict["key3"] // Optional<Int>型のnil

値の更新、追加、削除

Dictionary<Key, Value>型の値の更新・追加・削除には先ほど説明した値へのアクセスを利用して行います。

更新

値を更新する場合、更新したいKeyにアクセスし代入演算子=で更新後の値を設定します。

var dict = ["key1": 1, "key2": 2]

// "Key1"の値を更新
dict["key1"] = 3 // ["key1": 3, "key2": 2]

追加

値を追加する場合、辞書に存在しないKeyを指定して代入演算子=で追加する値を設定します。

var dict = ["key1": 1, "key2": 2]

// "Key3"の値を追加
dict["key3"] = 3 // ["key1": 1, "key2": 2, "key3": 3]

削除

値を削除する場合、削除したい値のKeyを指定して代入演算子=でnilを設定します。

var dict = ["key1": 1, "key2": 2]

// "Key1"の値を削除
dict["key1"] = nil // ["key2": 2]

まとめ

  • Dictionary<Key, Value>型はSwiftでキーバリュー型の値を実装した型である。
  • 糖衣構文 [Key : Value]
  • 辞書リテラル [Key1 : Value1, Key2 : Value2, Key3 : Value3]
  • KeyにはHashableプロトコルに準拠した型、Valueにはどんな型もOK
  • アクセスするには[]でKeyを指定
  • 更新・追加・削除はアクセスして代入

キーバリュー型の値はコーディングする際によく利用します。
Dictionary<Key, Value>型についてしっかりと学び、Swiftでもキーバリュー型の値を使いこなしていきたいですね。
最後までお読みいただきありがとうございました。
それでは、また。