1.はじめに
前回配列について説明したので、これまた重要な要素である辞書について説明していこうと思います。前回の配列について解説した記事のURLは以下になります。
(URL:https://qiita.com/0901_yasyun/items/6cc4c0175082e9b63d31)
2.辞書とは
辞書とは、配列と同様に複数のインスタンスを格納できるコレクションの1種です。Swiftの辞書はDictionary型ですが、配列と同様、構造体として実現されており、変数への代入などの動作によって、必要に応じて新しいインスタンスが作成されます。
1つの辞書には、キーと値の組を複数個格納でき、キーから値を検索して参照、格納を行うので、1つの辞書に含まれるキーはすべて異なります。
キーに対応する値は1つですが、異なるキーに同じ値が設定されていても問題はありません。
ただし、キーと値はそれぞれ同一の型で統一されている必要があります。
var y = ["Swift":2014, "Objective-C":1983]
この例ではString型をキーとし、Int型を値とするエントリを2個もった辞書インスタンスを生成しています。
型のみを宣言する場合は、次のように記述します。
var y : [String : Int]
次のように記述すると、String型をキーとし、Int型を値とする辞書のインスタンスが代入されますが、格納されている要素は0個です。
var y = [String : Int]() // イニシャライザの呼び出し
空の辞書を表すには[:]と記述します。変数を型宣言し、空の辞書を代入するように記述しても、先ほどと同様な初期化が行われます。
var y : [String : Int] = [:] // 型を指定した変数に空の辞書を代入
なお、辞書型はパラメータ付き型指定で次のように記述することもできます。
var y : Dictionary<String, Int> // [String:Int]と同じ意味
var y : Dictionary<String, Int>() // イニシャライザの呼び出し
3.辞書へのアクセス
すでに要素をもつ辞書型の定数や変数に対し、キーを指定して値を取り出すことができます。そのために、配列にアクセスするときと同じように[]を使い、[]の中にキーを指定します。ただし返り値はオプショナル型で、存在しないキーを指定するとnilが返ってきます。
if-let文を使用した次に例を見てください。
var y = ["Swift":2014, "Objective-C":1983]
if let v = d["Swift"] { print(v) } // 存在するキーなので"2014"と出力
if let v = d["Ruby"] { print(v) } // 存在しないキーなので出力なし
この例では辞書は[String:Int]型なので、返される値はInt?型です。
辞書に新しい値を追加するには、[]の中にキーを指定して値を代入します。
また、既に存在しているキーの要素を削除するには、そのキーを指定してnilを代入します。以下の例を見てください。
var e = ["Ruby":1995]
print(e) // ["Ruby": 1995]と出力
e["Java"] = 1995
e["Python"] = 1991
print(e) // ["Java": 1995, "Ruby": 1995, "Python": 1991]と出力
e["Java"] = nil
print(e) // ["Ruby": 1995, "Python": 1991]と出力
ここまでの例ではキーが文字列で、値が整数でしたが、他の型でももちろん大丈夫です。
しかし、Swiftの基本的なデータ型の中で辞書のキーとして利用できるものは、各種整数型、実数型、Bool型、文字列、文字などです。実数もキーにできますが、実数値には誤差がつきものなので注意が必要です。
4.辞書の比較
辞書同士を比較する際には、演算子「==」と「!=」が使えます。互いに同じキーの集合を持ち、同じキーに等しい値が割り当てられている辞書を等しいと判断します。以下の例を確認してください。
var a = ["one":"I", "two":"II", "three":"III"]
let b = ["two":"II", "one":"I"]
a == b // false
a["three"] = nil
a == b // true
5.辞書から要素を取り出す
辞書は付属型としてのキーを表すKey型、値の型を表すValue型を持ちます。
またキーだけからなるコレクション、値だけからなるコレクションを提供するプロパティがあり、それぞれの型はKeys型、Values型となっています。
辞書自体もコレクションなので、要素を表す型であるElement型、添字の型であるIndex型を持っています。Element型は次のタプルの別名となっています。
(key: Key, value: Value)
for-in文を使って、辞書から要素を1つずつ取り出すことができます。その際、取り出されるのが上記のタプルです。以下の例を確認してください。
var dic = [String: Int]()
var n = 1
for ch in "ありがとう" {
dic[String(ch)] = n; n += 1
}
print(dic)
for t in dic { // タプルで取り出す
print("\(t.key)=\(t.value)", terminator:" ")
}
print()
for (k, v) in dic { // キーと値を取り出す
print("\(k)=\(v)", terminator:" ")
}
print()
これを実行するとこのような結果が得られます。
["が": 3, "と": 4, "り": 2, "う": 5, "あ": 1]
が=3 と=4 り=2 う=5 あ=1
が=3 と=4 り=2 う=5 あ=1
この結果より、辞書の要素が取り出される順番は、実行するたびに異なるのが分かります。
この仕組みについて解説すると少し長くなってしまうので、ひとまず取り出される順番はランダムだということを覚えておいてください。
気になる方は、ハッシュ値などについて調べれば仕組みが分かると思います。
6.おわりに
今回は辞書の基本的な仕組みと主な使い方について解説しました。
今回の記事ではプロパティやメソッドについて、詳しく説明することができなかったので、いつかまた説明する記事が書ければと思います。
読んでくれた方、ありがとうございました。