SwiftのDictionaryの使い方
こんにちは、@Yuuです。
Swiftを使っていると良く使うDictionary。
よく使うものの忘れてしまう事が多いので、Dictionaryの使い方をまとめてみました。
スポンサーリンク
解説を行う環境
今回僕が解説を行う環境です。
- OS:OS X Yosemite10.10.5
- Xcode:7.2
Xcodeのバージョンが7以降なのでSwift2での解説になります。
Swift(無印)でも書き方はほぼ一緒だと思いますが、違う場合はご了承下さい。
Dictionaryとは
SwiftのDictionaryとは、PHPやJavaScriptでは「連想配列」、Javaでは「コレクション(HashMap)」と呼ばれる、keyとvalueで関連付けられた配列のようなものです。
例えば"rose"というkeyに対して、"バラ"というvalueを取得出来る、みたいな感じです。
うん、これだけだと何言ってるか全然分からんですね。
実際に書いて説明すれば分かると思うので、書いてみましょう!
また、Dictionaryについて書かれた公式サイトは以下のページ中盤になります。
英語ですが非常に分かりやすく書かれているので、英語を読めない人、Swiftを初めて触る人でも感覚で理解出来ると思います。
余談ですが、僕は公式ページがあまりに見やすくて感動してしまいました。
自分もこれぐらい綺麗に記事をまとめたい・・
(;ω;)
Dictionaryを使用する
お待たせしました!Dictionaryの使用方法を見ていきます。
1. Dictionaryの変数の初期化
Dictionary型に変数を宣言する場合、以下のように書けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// // Dictionary型の変数の初期化 // // 空の変数の宣言 var dict1 = [Int: String]() var dict2 = Dictionary<Int, String>() var dict3: [Int: String] = [:] var dict4: Dictionary<Int, String> = [:] // 書き方は違っても上記4つの変数は全て[Int: String]のDictionary型になる // 宣言時に値も格納する var flowerDict1: Dictionary<String, String> = [ "rose": "バラ", "lily": "ユリ" ] var flowerDict2: [String: String] = [ "rose": "バラ", "lily": "ユリ" ] var flowerDict3 = [ "rose": "バラ", "lily": "ユリ" ] // 書き方は違っても3つとも同じ値を格納する |
空の変数を宣言する場合も、変数の宣言時に値を設定する場合もどちらも書き方が複数種類存在します。
ですので、ご自分に合った書き方をすればいいかなぁと思います。
ただしAppleの先ほどの公式サイトでは、以下のような変数の宣言の仕方をしているので、この書き方がApple的にはベストと考えているのかもしれません。
1 2 3 4 5 6 7 8 9 |
// // Apple公式サイトでのDictionary型の変数の初期化 // // 空の変数の宣言 var dict1 = [Int: String]() // 宣言時に値も格納する var flowerDict2: [String: String] = ["rose": "バラ", "lily": "ユリ"] |
2. Dictionaryへのアクセスと変更
要素数の確認、値の追加・変更・削除などDictionaryを使う際に必要となる基本的な使い方です。
2-1. 要素の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// // 要素の確認 // // 変数の宣言 var menus: [String: Int] = ["カレー": 800, "パスタ": 900, "ステーキ": 1200] var emptyDict : [String: Int] = [:] // 格納されている値の数 menus.count // 3 // 値の取得 print(menus["カレー"]) // 800 print(menus["パスタ"]) // 900 print(menus["ステーキ"]) // 1200 print(menus["うどん"]) // nil // 要素が存在しない場合はnilを返す // 値が取得出来たかどうかで処理を分ける if let price = menus["カレー"] { print("カレーの価格は\(price)円です") } else { print("メニューにカレーはありません") } // 要素が存在するかを確認 menus.isEmpty // false emptyDict.isEmpty // true |
menus["カレー"]
のようにkeyからvalueを取得する場合、Optional(800)
となって値を受け取ります。
そのため、以下のように新たな変数を宣言し値を取得する場合は、最後に「!」が必要になります。
let price: Int = menus["カレー"]!
2-2. 要素の追加・変更・削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
// // 要素の追加・変更・削除 // // 変数の宣言 var menus: [String: Int] = ["カレー": 800, "パスタ": 900] // ---- 要素の追加 ---- // // 要素の追加 menus["ステーキ"] = 1200 print(menus) // ["カレー": 800, "パスタ": 900, "ステーキ": 1200] // ---- 要素の変更 ---- // // 要素の変更(方法.1) menus["カレー"] = 850 print(menus) // ["カレー": 850, "パスタ": 900, "ステーキ": 1200] // 要素の変更(方法.2) if let oldPrice = menus.updateValue(1000, forKey: "パスタ") { print("パスタの昔の価格は\(oldPrice)円") // パスタの昔の価格は900円 } print(menus) // ["カレー": 850, "パスタ": 1000, "ステーキ": 1200] // updateValueを使用する事で変更前の値を取得しつつ、値を変更する事が出来る // ---- 要素の削除 ---- // // 要素の削除(方法.1) menus["ステーキ"] = nil print(menus) // ["カレー": 800, "パスタ": 1000] // 削除したい要素のkeyに対してnilを入れる事でその要素を削除出来る // 要素の削除(方法.2) if let removePrice = menus.removeValueForKey("カレー") { print("削除前のカレーの価格は\(removePrice)円") //削除前のカレーの価格は850円 } print(menus) // ["パスタ": 1000] // removeValueForKeyを使用する事で削除前の値を取得しつつ、要素を削除する事が出来る // 要素の完全削除 menus.removeAll() menus = [:] // 上記2つは両方とも同じ処理内容になる |
3. Dictionaryのfor文とkey・valueのみの取得
最後にkeyまたはvalueのみを取り出し新たな配列を作成する方法と、Dictionaryのfor文の使い方を見ていきます。
3-1. key・valueのみの取得
"dictionaryの変数".keys
と書くとdictionaryのkeyのみを取得し、"dictionaryの変数".values
と書くとdictionaryのvalueのみを取得出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// // key・valueのみの取得 // // 変数の宣言 var menus: [String: Int] = ["カレー": 800, "パスタ": 900, "ステーキ": 1200] // keyのみの新たな配列を作成 var menuNames: [String] = [String](menus.keys) print(menuNames) // ["カレー", "ステーキ", "パスタ"] // valueのみの新たな配列を作成 var menuPrices: [Int] = [Int](menus.values) print(menuPrices) // [800, 1200, 900] |
menus.keys
・menus.values
のようにkeyやvalueのみを取り出し配列を作成する場合、格納した順番通りの配列が作成されないので注意が必要です。
3-2. for文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// // for文 // // 変数の宣言 var menus: [String: Int] = ["カレー": 800, "パスタ": 900, "ステーキ": 1200] // for-in文で(key, value)の組み合わせを取得出来る for (menuName, menuPrice) in menus { print("メニュー名:\(menuName) 価格:\(menuPrice)円") } // メニュー名:カレー 価格:800円 // メニュー名:ステーキ 価格:1200円 // メニュー名:パスタ 価格:900円 // keyのみのfor文 for menuName in menus.keys { print("メニュー名:\(menuName)") } // メニュー名:カレー // メニュー名:ステーキ // メニュー名:パスタ // valueのみのfor文 for menuPrice in menus.values { print("価格:\(menuPrice)円") } // 価格:800円 // 価格:1200円 // 価格:900円 |
Dictionaryをfor文で出力した場合、格納した順番通りに表示されません。
格納した順番通りではないですが、Dictionaryをkeyでソートして処理を行いたい場合は、以前に僕が書いた記事を参考にしてみてください。
あとがき
Dictionaryは便利なので良く使いますが、いざという時に細かい書き方・使い方を忘れてしまうことが多かったのでまとめてみました。
少しでも皆さんの参考になれば幸いです。
ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧