【Swift】辞書型

辞書型とはkeyと値を紐付けたデータを複数代入できる型のことで、アクセスするときは、keyを指定してそのkeyに紐付く値にアクセスします。
辞書型という名前の通り、辞書を引くような使い方をしたい時などに使います。
配列とは違い、インデックス番号は使えません。

前回は while文 について書きました。

今回は 辞書型 について書いていこうと思います。

辞書型とは

辞書型とは key を紐付けたデータを複数代入できる型のことで、アクセスするときは key を指定して、その key に紐付く にアクセスします。
辞書型という名前の通り、辞書を引くような使い方をしたい時などに使います。
配列とは違い、インデックス番号は使えません。

配列型 についてはこちらの記事で紹介しています。

辞書型の書式

//書式1
[keyの型名:値の型名]

//書式2
Dictionary<keyの型名,値の型名>

書式 1
[ ] の中に key の型名を書いて : で区切って値の型名を書きます。
型推論を使って定義することも可能です。

書式 2
Dictionary キーワードを書いて < > の中に key の型名を書いて , で区切って値の型名を書きます。

辞書型を使った例

//例1(書式1)
var geregere:[String:Int]
geregere = ["HP": 200, "MP": 70, "ATTACK": 120]

print(type(of: geregere)) //Dictionary<String, Int>
print(geregere["HP"]) //Optional(200)

//例2(書式2)
var borongo:Dictionary<String,Int>
borongo = ["HP": 180, "MP": 75, "ATTACK": 125]

print(type(of: borongo)) //Dictionary<String, Int>
print(borongo["MP"]) //Optional(75)

//例3(型推論)
var tiroru = ["HP": 190, "MP": 80, "ATTACK": 130]

print(type(of: tiroru)) // //Dictionary<String, Int>
print(tiroru["ATTACK"]) //Optional(130)

例 3 のように型推論を使って書くこともできます。

辞書型はアクセスすると Optional型 で返ってくる

上の例のアクセスした結果を見ると頭に Optional と付いています。
key を指定してアクセスしていますが、あるか分からない key にアクセスする可能性があるためです。
確実にある key だと分かっている場合であれば強制アンラップ ! でアンラップしてもいいですが、そうでない場合の方が多いと思うので、そういう場合は ?? 演算子を使って nil だった場合に代わりに代入する値を指定した方が安全です。

Optional型アンラップ についてはこちらの記事で紹介しています。

辞書型の変数定義〜アンラップしてアクセスする例

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]
print(suraimu["HP"]) //Optional(100)

まだアンラップ前なので、100 の前に Optional が付いています。
これをアンラップしていきます。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]
print(suraimu["HP"]) //Optional(100)

//アンラップしてアクセスする
print(suraimu["HP"] ?? "nil") //100

?? 演算子を使って、アクセスした key “HP”nil だった場合は文字列の “nil” を代入します。
これで出力されている値は 100 になったので、
Optional型 から Int型 にアンラップすることができました。

次は key に無いものを指定して、結果が変わるか見てみます。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]
print(suraimu["HP"]) //Optional(100)

//アンラップしてアクセスする
print(suraimu["HP"] ?? "nil") //100

//keyに無いものを指定してみる
print(suraimu["Defense"] ?? "nil") //nil

key“Defense” と指定して、keynil だった場合は文字列の “nil” を代入します。
結果は “nil” になります。
“Defense” という key は定義していないので( nil なので )、右辺の “nil” が代わりに代入されます。

dictionaryコードimg

要素の順番は保証されない

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//要素の順番は保存されない
for i in suraimu.keys {
    print(i)
}

//実行結果
/*
ATTACk
HP
MP
*/

配列型とは異なり、辞書型は要素を順番で管理しないので参照するたびに順番が変わります。そのためインデックス番号が使えません。

要素の追加と変更方法

追加または変更の書式

変数名、または定数名[key] = 値

要素の追加

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//要素の追加
suraimu["Defense"] = 10
print(suraimu) //["HP": 100, "ATTACK": 50, "Defense": 10, "MP": 30]

要素の変更

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//要素の追加
suraimu["Defense"] = 10
print(suraimu) //["HP": 100, "ATTACK": 50, "Defense": 10, "MP": 30]

//要素の変更
suraimu["Defense"] = 20
print(suraimu) //["HP": 100, "ATTACK": 50, "Defense": 20, "MP": 30]

追加したい key が既存でなければ追加、key がもし既存のものであれば値の変更になります。

要素の削除

removeValue(forKey:) メソッド

辞書型の要素を削除したいときは、removeValue(forKey:) メソッド を使います。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//要素の追加
suraimu["Defense"] = 10
print(suraimu) //["HP": 100, "ATTACK": 50, "Defense": 10, "MP": 30]

//要素の変更
suraimu["Defense"] = 20
print(suraimu) //["HP": 100, "ATTACK": 50, "Defense": 20, "MP": 30]

//要素の削除
//removeValue(forKey:)メソッド
suraimu.removeValue(forKey: "Defense")
print(suraimu) //["HP": 100, "ATTACK": 50, "MP": 30]

removeValue(forKey:) メソッドの引数に削除したい key 指定します。 key が既存であれば削除することができます。

辞書型とよく使うメソッドとプロパティ

.contains メソッド

.contains メソッドは、指定した要素が含まれているかどうかを Bool値 で返すメソッドです。
指定した要素があれば true
指定した要素がなければ false が返ってきます。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//.containsメソッド
print(suraimu.keys.contains("HP")) //true
print(suraimu.keys.contains("Defense")) //false

.keys プロパティ

.keys プロパティは、key の一覧を取得することができるプロパティです。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//.keysプロパティ
print(suraimu.keys) //["HP", "MP", "ATTACK"]

.values プロパティ

.values プロパティは、値の一覧を取得することができるプロパティです。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//.valuesプロパティ
print(suraimu.values) //[100, 30, 50]

.count プロパティ

.count プロパティは、要素の数を取得することができるプロパティです。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//.countプロパティ
print(suraimu.count) //3

.isEmpty プロパティ

.isEmpty プロパティは、要素が含まれているかどうかを Bool値 で取得することができるプロパティです。
何か要素が入っていれば false
何も入ってなければ true を取得します。
要素が 1 つでも入っていれば false 、空であれば true になります。

var suraimu:[String:Int]
suraimu = ["HP": 100, "MP": 30, "ATTACK": 50]

//.isEmptyプロパティ
print(suraimu.isEmpty) //false
dictionaryコードimg2

辞書型 はコレクション型の 1 つで、配列型 もその 1 つです。
この 2 つの他に 集合型( Set ) というコレクション型もあります。
以上 辞書型 についてでした。

次回は 集合型 について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/