Menu

Category

Archive

logo


The Swift Programming Language ~ Collection Types [Dictionary]

2014-06-07 17:15:00 +0900
  • このエントリーをはてなブックマークに追加

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 var airports: Dictionary<String, String> = 
2   ["TYO": "Tokyo",
3    "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 airports["LHR"] = "London" // add
2 airports["LHR"] = "London Heathrow" // update

と、配列のように subscripts を使用して実行する方法があります。また、updateValue(forKey:) メソッドを使用した方法もあります。

このメソッドを使用した場合にはも、キーがある場合には、そのキーに対応する値を修正し、キーが存在しない場合には、新しくキーと値のペアを作成します。

subscripts を指定する場合と異なるのは、古い値を返り値に取ることです。もし、updateValue(forKey:)で指定したキーと値がなかった場合には nil を返します。

1 if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") {
2     println("The old value for DUB was \(oldValue).")
3 }

15. Dictionary 要素の削除

Dictionary の要素を削除する方法もいくつかあります。まずは、nil を代入する方法。

1 airports["APL"] = "Apple International"
2 // "Apple International" is not the real airport for APL, so delete it
3 airports["APL"] = nil
4 // APL has now been removed from the dictionary

そして、removeValueForKey()を使用する方法。

1 if let removedValue = airports.removeValueForKey("DUB") {
2     println("The removed airport's name is \(removedValue).")
3 } else {
4     println("The airports dictionary does not contain a value for DUB.")
5 }

このメソッドは指定したキーが存在すれば削除し、削除された要素の値を返します。もしキーが存在しなかった場合には、nil を返します。そのため、上記のコードのように、if 文と一緒に使用することができます。

16. Dictionary の iteration

Dictionary も簡単に全ての要素にアクセスすることができます。for-in ループでキーと値の tuple を受け取り処理できます。

1 for (airportCode, airportName) in airports {
2     println("\(airportCode): \(airportName)")
3 }
4 /* Output:
5 TYO: Tokyo
6 LHR: London Heathrow
7 */

また、Dictionary の keys/values プロパティを使用して、それぞれ iteration もできます。

 1 for airportCode in airports.keys {
 2     println("Airport code: \(airportCode)")
 3 }
 4 /* Output:
 5 Airport code: TYO
 6 Airport code: LHR
 7 */ 
 8 for airportName in airports.values {
 9     println("Airport name: \(airportName)")
10 }
11 /* Output:
12 Airport name: Tokyo
13 Airport name: London Heathrow
14 */

17. Dictionary の init, reset

Dictionary を初期化するには、

1 var namesOfIntegers = Dictionary<Int, String>()
2 // namesOfIntegers is an empty Dictionary<Int, String>

リセットするには、: を使用します。

1 // this is not an array
2 namesOfIntegers[16] = "sixteen"
3 // namesOfIntegers now contains 1 key-value pair
4 namesOfIntegers = [:]
5 // 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 let a = [1, 2, 3]
2 a.removeLast() // err
3 a[1] = 10 // ok

それに対して、Dictionary に対して let を使い、Immutable にすると、要素数はもちろん、値を変更することもできません。

1 let b = [
2     1: "1",
3     2: "2"
4 ]
5 b[1] = "One" // err

Collection を使用する際、サイズが変更されることがない場合は、let を使用して、Immutable にした方がよいです。このことにより、Swift コンパイラーが最適化されます。