【Swift】辞書(Dictionary)型の操作方法!追加/削除/更新/for文
この記事からわかること
- Swiftの辞書型(Dictionary型)の使い方や操作方法
- 定義や追加、削除、更新など
- for文で中身を回して取り出すには?
- Dictionary(grouping:, by:)で配列内の同じ値をグループ化する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
辞書型(Dictionary型)とは?
Swiftの辞書型(Dictionary型)とはキーと値の2つでデータを保持するコレクション型(※)の1つです。※他には配列(Array)やSet型などがある
キーは辞書内で一意である必要があるので重複したキーを設定することはできません。また順序を保持することができないので格納された順番などではなく参照するたびに順序が入れ替わる可能性があります。
値にはさまざまなデータ型を格納することができ、重複した値も自由に格納することができます。
使い方
Swiftでは辞書型はDictionary
構造体として定義されています。キーはString
型でもlnt
型でも定義することができます。
@frozen struct Dictionary<Key, Value> where Key : Hashable
辞書型を定義するには[キー:値]
形式で記述します。
var user = ["name": "あめ","birthplace": "東京都"]
空の辞書型を生成する
空の辞書型を定義して変数に格納する際は明示的にデータ型を定義して[データ型:データ型]
形式もしくはDictionary< データ型, データ型 >
のように記述します。
var emptyDic: [String: String] = [:]
// 同義
var emptyDic2: Dictionary<String, String> = [:]
またイニシャライザを使用して以下のように記述することも可能です。
let emptyDic = [String: Int]()
値を取得する
var responseMessages = [200: "OK",
403: "Access forbidden",
404: "File not found",
500: "Internal server error"]
変数に格納した辞書型の値を取得するには変数[キー]
形式で取得することができます。キー値が文字列なら["文字列"]
となります。取得できる値はOptional
になります。これは添字で指定したキーが存在しないものを指定される可能性があるためです。存在しないキーを指定した場合はnil
が返ります。
print(responseMessages[404]) // Optional("File not found")
print(responseMessages[100]) // nil
キーを取得する
キーに指定されている値を取得するにはkeys
プロパティから保持しているkeyを要素とする配列形式で参照可能です。
print(responseMessages.keys) // [200, 404, 403, 500]
値を取得する
キーと紐づいている値だけを取得するにはvalues
プロパティから保持しているkeyを要素とする配列形式で参照可能です。
print(responseMessages.values) // ["OK", "Internal server error", "Access forbidden", "File not found"]
値を更新する
辞書型の値を更新するには変数[キー]
で変更したい箇所を指定し値を入れ込みます。
responseMessages[404] = "見つかりませんでした"
値を追加する
新しいキーと値のペアを追加する場合も新しいキーを指定してそのまま値を入れ込みます。
responseMessages[301] = "リダイレクト"
updateValueメソッド
responseMessages.updateValue("リダイレクト", forKey:"301" )
値を削除する
保持しているキーと値のペアを削除するにはnil
を格納します。
responseMessages[301] = nil
removeValueメソッド
removeValue
メソッドを使用しても削除することが可能です。その場合は引数にキー値を指定します。
let removed = responseMessages.removeValue(forKey: 301)
for文で回す
辞書型の中身をfor文を使って取り出すことも可能です。各キーと値にはタプルを使って受け取ることで両方を参照することができます。
for (code, message) in responseMessages {
print("HTTPステータス:\(code) &メッセージ:\(message)")
}
またkeys
プロパティまたはvalues
プロパティを使用してどちらか片方にアクセスすることもできます。
for code in responseMessages.keys {
print("HTTPステータス:\(code)")
}
Dictionary(grouping:, by:)で配列の同じ要素をまとめて辞書型に変換する
Dictionary(grouping:, by:)
は第一引数に受け取った配列を第二引数で指定した値が同じものをグループ化した辞書型を返すメソッドです。
struct Event {
var name: String
var date: Date
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let list: [Event] = [
Event(name: "Event 1", date: dateFormatter.date(from: "2023-10-20")!),
Event(name: "Event 2", date: dateFormatter.date(from: "2023-10-21")!),
Event(name: "Event 3", date: dateFormatter.date(from: "2023-10-20")!),
Event(name: "Event 4", date: dateFormatter.date(from: "2023-10-21")!),
Event(name: "Event 5", date: dateFormatter.date(from: "2023-10-22")!)
]
let groupedDictionary = Dictionary(grouping: list, by: { $0.date })
for (key, value) in groupedDictionary {
print("\(dateFormatter.string(from: key)): \(value.map { $0.name })")
// 2023-10-22: ["Event 5"]
// 2023-10-21: ["Event 2", "Event 4"]
// 2023-10-20: ["Event 1", "Event 3"]
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。