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
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 コンパイラーが最適化されます。