くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

SwiftのDictionaryについて

今回はSwiftのDictionary型についてまとめようと思います

Dictionaryとは?

Dictionaryとはキーと値をセットにした配列のようなものです

例えば、Dictionaryでは、「名前 : “山田”」「年齢 :23」「性別 : “男”」のようにキーと値をセットで作成します。 この場合にはキーが名前・年齢・性別で、値は“山田”・23・“男”です

キーに紐づく値を参照できるため、ディクショナリを辞書型とも呼びます

注意点としては順番が保証されているわけではないので、何番目に取得できるなどの処理を行う場合には注意が必要です

基本的な使い方は次のように定義します

let fruits: Dictionary<String, Int> = 
["りんご": 100, "オレンジ": 80, "メロン": 700]

// キーを指定することで値を取得できる
fruits["いちご"]
 
for (key, value) in fruits {
    print("\(key)は\(value)円です。")
}

今回はキーと値をそれぞれString型とInt型で定義しています。定義と違う型を指定するとエラーになるので注意をしてください

そして値を追加・更新する場合には次のように行います

let fruits: Dictionary<String, Int> = 
["りんご": 100, "オレンジ": 80, "メロン": 700]

// キーが存在する場合には更新、ない場合には追加
fruits.updateValue(300, forKey: "いちご")

// キーが存在する場合には更新、ない場合には追加
fruits["いちご"] = 300

fruits["いちご"] = 300の方が一般的に使われていると思います

削除する場合には次のように対応します

let fruits: Dictionary<String, Int> = 
["りんご": 100, "オレンジ": 80, "メロン": 700]

//要素の削除
fruits.removeValue(forKey:"りんご")

Dictionaryの細かい処理

ここからはもう少し細かいDictionaryで行う処理を見ていこうと思います

キーでソートする

1つ目はキーでソートするパターンです。 Dictionaryは順番が保証されているわけではないのでソートする必要が出てくるかもしれません

var dic = [
    "C" : 2,
    "A" : 3,
    "B" : 4,
]

//     [(key: "A", value: 3),
//     (key: "B", value: 4),
//     (key: "C", value: 2)]の順で出力される
print(dic.sorted(by: { $0.key < $1.key}))

<で昇順、>で降順にソートされます

グルーピングする

groupingを使うことで、配列のデータを特定の条件でDictionaryにすることができます

let names = ["Apple", "Grape", "Apricot", "Guava"]

// グルーピングする["G": ["Grape", "Guava"], "A": ["Apple", "Apricot"]]
let initialGroup = Dictionary(grouping: names) { $0.first ?? "#" }

// 文字数をキーとして文字数が同じデータをまとめる
// [5: ["Apple", "Grape", "Guava"], 7: ["Apricot"]]
let countGroup = Dictionary(grouping: names) { $0.count }

まとめ

ここまでDictionaryの処理を確認しましたが、本来はDictionaryを使うのは設計を見直すべきかなと個人的には感じています

しかし、要件上使わざるをえない場合もあるかもしれないのでそのためのリファレンスになればいいかなと思います

参照

docs.swift.org

teratail.com

qiita.com

www.choge-blog.com