Swiftの連想配列(Dictionary)入門!キーと値の基本から型安全まで徹底解説
生徒
「Swiftで名前と年齢みたいなセットを一覧で持つ方法ってありますか?」
先生
「はい、SwiftではDictionaryという連想配列を使うことで、名前と年齢のような『キー』と『値』のペアを簡単に管理できますよ。」
生徒
「連想配列ってちょっと難しそう…初めてでも使えますか?」
先生
「もちろんです。一つ一つ順番に説明していくので、一緒に理解していきましょう!」
1. Dictionary(連想配列)とは?
SwiftのDictionary(ディクショナリ)は、「キー(Key)」と「値(Value)」をセットで管理するコレクション型です。たとえば「名前 → 年齢」のように、キーを使って値を簡単に取り出すことができます。
これは「名前で人の情報を検索する電話帳」のようなイメージです。普通の配列(Array)は順番でアクセスしますが、連想配列は名前(キー)でアクセスできるのが特徴です。
2. SwiftでDictionaryを作成する基本
Swiftでは、次のようにDictionaryを作成します。
var ages: [String: Int] = [
"太郎": 20,
"花子": 18,
"次郎": 22
]
この例では、名前(String型)がキーで、年齢(Int型)が値になっています。キーと値の型をコロンでつなげて、[Key: Value]の形で書きます。
3. Dictionaryの値を取り出す方法
特定のキーに対応する値を取得するには、次のように書きます。
let ageOfTaro = ages["太郎"]
print(ageOfTaro)
Optional(20)
注意点として、Dictionaryから値を取り出すときはOptional(値があるかもしれない、ないかもしれない型)になります。これは、指定したキーが存在しない可能性があるためです。
4. 値の変更と追加方法
Dictionaryに新しいキーと値を追加したり、既存の値を変更したりするには以下のように書きます。
ages["三郎"] = 25 // 新しいキーを追加
ages["太郎"] = 21 // 既存の値を変更
このように、キーを指定して値を代入するだけで追加や更新ができます。
5. Dictionaryから値を削除する
キーごと値を削除したい場合は、次のように書きます。
ages.removeValue(forKey: "花子")
removeValue(forKey:)メソッドを使うと、指定したキーの値を削除できます。
6. Dictionaryをループ処理する方法
全てのキーと値を取り出して処理するには、for-inループを使います。
for (name, age) in ages {
print("\(name)さんは\(age)歳です")
}
太郎さんは21歳です
次郎さんは22歳です
三郎さんは25歳です
このように、(キー, 値)のペアでループできます。配列のループとよく似ていますが、順番は保証されていません。
7. 空のDictionaryを作成する方法
最初は中身が空のDictionaryを用意して、あとから値を追加したい場合には次のように書きます。
var students: [String: String] = [:]
students["A001"] = "佐藤"
students["A002"] = "鈴木"
このように、[:]を使って空の連想配列を作ることができます。
8. Dictionaryで型安全を意識しよう
SwiftのDictionaryは型安全(type safety)を守ることで、プログラムの間違いを未然に防ぐ仕組みになっています。たとえば、次のように異なる型の値を混ぜることはできません。
// エラーになる例
// var data: [String: Any] = ["key1": "文字列", "key2": 123]
型安全とは、あらかじめ「このDictionaryは文字列のキーと、整数の値しか受け付けません」と決めておくことで、意図しない使い方を防ぐしくみです。
9. Dictionaryの存在確認:キーがあるかどうか
特定のキーが存在するかどうかを確認したいときには、次のようにif letやnilチェックを使います。
if let age = ages["花子"] {
print("花子さんは\(age)歳です")
} else {
print("花子さんの情報は見つかりません")
}
花子さんの情報は見つかりません
このように、存在しないキーを使ったときにエラーにならないよう、安全に処理する方法も大切です。
10. Dictionaryを使った実用サンプル
最後に、簡単な出席簿アプリのようなサンプルを見てみましょう。
let attendance: [String: Bool] = [
"佐藤": true,
"鈴木": false,
"田中": true
]
for (name, isPresent) in attendance {
let status = isPresent ? "出席" : "欠席"
print("\(name)さんは\(status)です")
}
佐藤さんは出席です
鈴木さんは欠席です
田中さんは出席です
このように、名前と出欠情報のようなデータを、連想配列でわかりやすく管理できます。