[Swift] Dictionaryをこねくり回すネタ集

### Dictionaryの特徴

 - keyは**hashable**(比較可能)なデータタイプでないといけない。
 - valueのデータタイプはなんでもOK
 - Dictionary内のvalueデータタイプは全部同じじゃないといけない
 - 順番はランダム / 考慮されない


## 初期化

### 値が最初nilの場合

```.swift
var nameOfIntegers = [Int:String]()

//or

var nameOfIntegers:[Int:String] = [:]
nameOfIntegers[16] = "sixteen"
print(nameOfIntegers)//[16: "sixteen"]
```

### 値がある場合

```.swift
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

// or

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
```

### *Valueには他のコレクションタイプも入れられる！

```.swift
let dictionary = [
   "A" : [1, 2],
   "Z" : [3, 4],
   "D" : [5, 6]
]
```

## データ取得・保存
基本的なメソッドはArray とセットと同じ(count, isEmptyなど)

### count
Dictionaryのデータ数を返す

```.swift
 print("The airports dictionary contains \(airports.count) items.")
// "The airports dictionary contains 2 items."
```

### isEmpty

Dictionary　の中身があるかどうか判定する。

```.swift
if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary is not empty.")
}
 // Prints "The airports dictionary is not empty."

```

### Add + Override
追加と上書きは同じように書きます。（ArrayとSetも同じ）

```practice.swift
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

//keyがないので、追加される
airports["LHR"] = "London"

//keyはあるので、Valueを上書きする
airports["YYZ"] = "Vancouver"
        
print(airports)
// ["DUB": "Dublin", "LHR": "London", "YYZ": "Vancouver"]
```

＊keyが存在している時だけに上書きしたい場合は、

```.swift
var airport = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
if (airport["YVR"] != nil){
  airport["YVR"] = "Vancouver"
}
        
print("airport: \(airport)") // airport: ["DUB": "Dublin", "YYZ": "Toronto Pearson"]

```


### ValueとKeyだけをプリントする

```.swift
let airportCodes = [String](airports.keys)
// airportCodes is ["YYZ", "LHR"]
     
let airportNames = [String](airports.values)
// airportNames is ["Toronto Pearson", "London Heathrow"]
```

### Keyを探してValueを取得する
返り値はOptionalなのでunwrapが必要です。

```.swift
var airport = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

if let yyz = airport["YYZ"]{
   print(yyz)//Toronto Pearson
}

```
### Valueを探してKeyを取得する


### ValueがArrayだった場合,ArrayのメンバーからKeyを取得する方法

[StackOverFlowで見つけた](https://stackoverflow.com/questions/32692450/swift-dictionary-get-key-for-values)のがいいなと思ったので、メモ！

```.swift
func findKeyForValue(value: Int, dictionary: [String: [Int]]) ->String?
{
    for (key, array) in dictionary
    {
        if (array.contains(value))
        {
            return key
        }
    }

    return nil
}
```
取得方法↓

```.swift
let kids = ["Toddlers": [0, 1, 2],
        "KinderGarden" :[3, 4, 5]]

print(self.findKeyForValue(1, dictionary: kids))
```


### for loop
こう書くと、keyとvalueが同時に取れます。

```swift
var companies = ["AAPL" : "Apple Inc", "GOOG" : "Google Inc", "AMZN" : "Amazon.com, Inc", "FB" : "Facebook Inc"]

for (key, value) in companies {
    println("\(key) -> \(value)")
}
```

### Sort

Dictionaryをソートする（keyがメインでソートされますが)
 
```.swift

let dictionary = [
   "A" : 9, "Z" : 3, "D" : 6, "O" : 12
]
        
let sortedDic = dictionary.sorted() { $0.0< $1.0 }
print(sortedDic)//[(key: "A", value: 9), (key: "D", value: 6), (key: "O", value: 12), (key: "Z", value: 3)]

``` 

Keyをソート

```.swift
let sortedKeys = Array(dictionary.keys).sorted(by: <)
print(sortedKeys)//["A", "D", "O", "Z"]
```

Valueをソート

```.swift
let fruitsDict = ["apple": 5, "pear": 9, "grape": 1]
let fruitsTupleArray = fruitsDict.sorted{ $0.value > $1.value }
        
print(fruitsTupleArray) // [(key: "pear", value: 9), (key: "apple", value: 5), (key: "grape", value: 1)]
```


ValueがArrayだった場合、複数のソートをこなす。

```.swift
var items = [Int: [String]]()
        
items[0] = ["Apple","/image/apple.png","29"]
items[1] = ["AAA","/image/aaa.png","29"]
items[2] = ["Banana","/image/banana.png","29"]
        
let itemResult = items.sorted { (first: (key: Int, value: [String]), second: (key: Int, value: [String])) -> Bool in
            return first.value.first! < second.value.first!
        }
        
print (itemResult)
//[(key: 1, value: ["AAA", "/image/aaa.png", "29"]), (key: 0, value: ["Apple", "/image/apple.png", "29"]), (key: 2, value: ["Banana", "/image/banana.png", "29"])]
```


### とりあえずここまで！
もっと載せていく予定です〜。