iBooks にある “The Swift Programming Language” の勉強メモ。Objective-C と C を普段書いている自分から、ちょっと馴染みがないものを特にまとめておきます。目次は こちら。
今回は、Collection Types の章の Dictionary に関して。
Collection Types
11. Swing Dictionary
Dictionary は Array と違い要素間の順番がなく、hashable key で参照されます。key は、Int や String、Double 等のユニークに表すことができるもの。
12. Dictionary の宣言
Dictionary タイプは、Dictionary<KeyType, ValueType> と表されます。Dictionary リテラルを使用して、初期化もできます。
1 2 3 | var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"] |
よりシンプルに書くには、
1 | var airports = ["TYO": "Tokyo", "DUB": "Dublin"] |
13. Dictionry の要素数
Array と同じように読み込み専用の count プロパティを使用して要素数を調べることができる。
1 | println("The dictionary of airports contains \(airports.count) items.") |
14. Dictionary の修正/追加
Dictionary を修正/追加には、
1 2 | airports["LHR"] = "London" // add airports["LHR"] = "London Heathrow" // update |
と、配列のように subscripts を使用して実行する方法があります。また、updateValue(forKey:) メソッドを使用した方法もあります。
このメソッドを使用した場合にはも、キーがある場合には、そのキーに対応する値を修正し、キーが存在しない場合には、新しくキーと値のペアを作成します。
subscripts を指定する場合と異なるのは、古い値を返り値に取ることです。もし、updateValue(forKey:)で指定したキーと値がなかった場合には nil を返します。
1 2 3 | if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") { println("The old value for DUB was \(oldValue).") } |
15. Dictionary 要素の削除
Dictionary の要素を削除する方法もいくつかあります。まずは、nil を代入する方法。
1 2 3 4 | airports["APL"] = "Apple International" // "Apple International" is not the real airport for APL, so delete it airports["APL"] = nil // APL has now been removed from the dictionary |
そして、removeValueForKey()を使用する方法。
1 2 3 4 5 | if let removedValue = airports.removeValueForKey("DUB") { println("The removed airport's name is \(removedValue).") } else { println("The airports dictionary does not contain a value for DUB.") } |
このメソッドは指定したキーが存在すれば削除し、削除された要素の値を返します。もしキーが存在しなかった場合には、nil を返します。そのため、上記のコードのように、if 文と一緒に使用することができます。
16. Dictionary の iteration
Dictionary も簡単に全ての要素にアクセスすることができます。for-in ループでキーと値の tuple を受け取り処理できます。
1 2 3 4 5 6 7 | for (airportCode, airportName) in airports { println("\(airportCode): \(airportName)") } /* Output: TYO: Tokyo LHR: London Heathrow */ |
また、Dictionary の keys/values プロパティを使用して、それぞれ iteration もできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | for airportCode in airports.keys { println("Airport code: \(airportCode)") } /* Output: Airport code: TYO Airport code: LHR */ for airportName in airports.values { println("Airport name: \(airportName)") } /* Output: Airport name: Tokyo Airport name: London Heathrow */ |
17. Dictionary の init, reset
Dictionary を初期化するには、
1 2 | var namesOfIntegers = Dictionary<Int, String>() // namesOfIntegers is an empty Dictionary<Int, String> |
リセットするには、: を使用します。
1 2 3 4 5 | // this is not an array namesOfIntegers[16] = "sixteen" // namesOfIntegers now contains 1 key-value pair namesOfIntegers = [:] // namesOfIntegers is once again an empty dictionary of type Int, String |
18. Collection の Mutability
Collection の Mutability は他と同じように var か let を使用して使い分けます。Array と Dictioary の Mutability の性質には少し差があります。
まず、Array を let を使用して Immutable にすると、サイズが変更することができなくなります。つまり、新しく要素を追加したり、削除することができません。しかし、すでに存在している要素の値を変更することはできません。あくまで、要素数を変更することができなくなります。
1 2 3 | let a = [1, 2, 3] a.removeLast() // err a[1] = 10 // ok |
それに対して、Dictionary に対して let を使い、Immutable にすると、要素数はもちろん、値を変更することもできません。
1 2 3 4 5 | let b = [ 1: "1", 2: "2" ] b[1] = "One" // err |
Collection を使用する際、サイズが変更されることがない場合は、let を使用して、Immutable にした方がよいです。このことにより、Swift コンパイラーが最適化されます。