【Swift】辞書(Dictionary)型の操作方法!追加/削除/更新/for文

この記事からわかること

  • Swift辞書型(Dictionary型)の使い方操作方法
  • 定義追加削除更新など
  • for文中身回して取り出すには?
  • Dictionary(grouping:, by:)配列内の同じ値グループ化する方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

辞書型(Dictionary型)とは?

Swiftの辞書型(Dictionary型)とはキーと値の2つでデータを保持するコレクション型(※)の1つです。※他には配列(Array)やSet型などがある

キーは辞書内で一意である必要があるので重複したキーを設定することはできません。また順序を保持することができないので格納された順番などではなく参照するたびに順序が入れ替わる可能性があります。

値にはさまざまなデータ型を格納することができ、重複した値も自由に格納することができます。

使い方

公式リファレンス:Dictionary構造体

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"]
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index