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

Dictionaryの特徴

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

初期化

値が最初nilの場合

var nameOfIntegers = [Int:String]()

//or

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

値がある場合

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

// or

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

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

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

データ取得・保存

基本的なメソッドはArray とセットと同じ(count, isEmptyなど)

count

Dictionaryのデータ数を返す

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

isEmpty

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

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が存在している時だけに上書きしたい場合は、

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だけをプリントする

let airportCodes = [String](airports.keys)
// airportCodes is ["YYZ", "LHR"]

let airportNames = [String](airports.values)
// airportNames is ["Toronto Pearson", "London Heathrow"]

Keyを探してValueを取得する

返り値はOptionalなのでunwrapが必要です。

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

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

Valueを探してKeyを取得する

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

StackOverFlowで見つけたのがいいなと思ったので、メモ!

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

    return nil
}

取得方法↓

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

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

for loop

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

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がメインでソートされますが)


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をソート

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

Valueをソート

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だった場合、複数のソートをこなす。

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"])]

とりあえずここまで!

もっと載せていく予定です〜。


『 Swift 』Article List