Swiftの基本データ型の一つである辞書(=Dictionary)に関して説明します。

辞書はキーとそれに対する値を管理するためのデータ構造です。JavaやRubyのハッシュと同じ感覚で使うことができます。

宣言

初期データを指定して宣言すると辞書の型は暗黙的に推測されるため不要となります。ただし要素の型を明示的に指定することでソースコードが読みやすくなるメリットがあります。

また空の辞書を宣言する場合は要素の型の指定が必須となります。

//辞書の宣言
let fruits = ["りんご": 200, "かき": 100, "もも": 300]
let currencyRates = [2: 240, 1: 120, 3: 360]

//型を明示して宣言
let fruits2: [String: Int] = ["りんご": 200, "かき": 100, "もも": 300]
let fruits3: Dictionary<String, Int> = ["りんご": 200, "かき": 100, "もも": 300]

//空の辞書
let fruits4 = [String: Int]()
let fruits5 = Dictionary<String, Int>()

取得

辞書の要素やサイズの取得が可能です。要素を列挙する場合キーと値を同時に取得できるほか、キー/値の列挙も可能です。

///// 取得
var vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]

//値の取得
let price: Int?  = vegetables["だいこん"] //=> 100 戻り値はInt?となる
vegetables["にんじん"] //=> nil

//値の列挙
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
for (name, price) in vegetables {
    //キーと値を同事
    print(name)
    print(price)
}
for name in vegetables.keys {
    //キーをループ
    print(name)
}
for value in vegetables.values {
    //キーをループ
    print(value)
}

//サイズの取得
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
vegetables.count //=> 3(キーの数)

//空かどうかを判定
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
vegetables.isEmpty //=> false

変更

キーに対する値を変更することができます。値にnilを設定するとキーごと削除されます。

//値の変更: キーアクセス
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
vegetables["だいこん"] = 999 //通常
vegetables //=> ["だいこん": 999, "じゃがいも": 50, "きゃべつ": 200]

//値の変更: updateValue
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
var old = vegetables.updateValue(9999, forKey: "だいこん") //=> old=999: 古い値を同事に取り出したい場合
vegetables //=> ["だいこん": 9999, "じゃがいも": 50, "きゃべつ": 200]

//値の削除: nilを代入
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
vegetables["じゃがいも"] = nil //nilで削除
vegetables //=> ["だいこん": 100, "きゃべつ": 200]

//値の削除: nilを代入
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
old = vegetables.removeValueForKey("きゃべつ") //=> old=200: 古い値を同事に取り出したい場合
vegetables //=> ["だいこん": 100, "じゃがいも": 50]

//値の全削除
vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
vegetables.removeAll()
vegetables //=> [:]

コピー

辞書をコピーすると元の辞書とは別の辞書になります。

var org_vegetables = ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
var copy_vegetables = org_vegetables
copy_vegetables["だいこん"] = 999
org_vegetables //=> ["だいこん": 100, "じゃがいも": 50, "きゃべつ": 200]
copy_vegetables//=> ["だいこん": 999, "じゃがいも": 50, "きゃべつ": 200]

値の配列を変更する

キーに対応した値として配列が保存されている辞書の場合、配列の値を変更するために一端変数に格納すると失敗します。直接辞書の要素にアクセスして変更する必要があります。

//一端変数に受けて変更しようとすると失敗する
var complexVegetables = ["だいこん": [100, 300, 400], "かいわれ": [10, 20, 30]]
var prices = complexVegetables["かいわれ"]
prices!.append(99)
complexVegetables //=>["だいこん": [100, 300, 400], "かいわれ": [10, 20, 30]]

//直接変更する必要あり
complexVegetables = ["だいこん": [100, 300, 400], "かいわれ": [10, 20, 30]]
complexVegetables["だいこん"] = [1, 2, 3]
complexVegetables["かいわれ"]![0] = 99
complexVegetables["かいわれ"]!.append(999)
complexVegetables //=> ["だいこん": [1, 2, 3], "かいわれ": [99, 20, 30, 999]]