[Xcode/Swift] 今更だけどArray・Set・Dictionaryの違いをざっくりとまとめる

比較

特徴ArraySetDictionary
順序順序を保持(追加順通り)順序を保持しない(順番保証なし)順序を保持しない(Swift5.2以降は挿入順を保持するが保証は弱い)
重複許可する許可しないキーは重複不可、値は重複可
検索速度O(n)平均O(1)(ハッシュ)平均O(1)(キー検索)
インデックスアクセス可能(array[0]不可能不可能(キーでアクセス)
並び替えソート可能ソート不可(変換後なら可能)ソート不可(変換後なら可能)
用途順序が必要&重複OKなデータ順序不要&重複NG&検索高速化キーと値をペアで管理
[Element]Set<Element>[Key: Value]

使い分けのイメージ

  • Array: → 「順番と回数をそのまま持つリスト」
    例:買い物リスト(同じ商品を複数回買う可能性あり)
  • Set → 「順番どうでもいい、種類だけ欲しい袋」
    例:イベント参加者のユニークな名前一覧
  • Dictionary → 「名前札つきの引き出し」
    例:ユーザーIDをキーに、その人のメールアドレスを値として管理

実装サンプル

Playgroundとかにそのままコピペで検証可能

// MARK: - Array(配列)
var fruits = ["Apple", "Banana", "Apple"]
print(fruits) // ["Apple", "Banana", "Cherry"]

// インデックスアクセス
print(fruits[0])

// ソート
let sortedFruits = fruits.sorted()
print(sortedFruits) // ["Apple", "Apple", "Banana"]

// MARK: - Set (集合)
var fruitsSet: Set<String> = ["Apple", "Banana", "Apple"]
print(fruitsSet) // ["Apple", "Banana"] 順序の保証はなし、重複を排除

// 要素の追加
fruitsSet.insert("Orange")
print(fruitsSet) // {"Orange", "Banana", "Apple"}

// メリット: 検索が高速
print(fruitsSet.contains("Apple")) // true

// MARK: - Dictionary (辞書)
var fruitColors: [String: String] = [
    "Apple": "Red",
    "Banana": "Yellow"
]

// 値の取得
print(fruitColors["Apple"] ?? "Unknown") // "Red"

// 値の更新
fruitColors["Apple"] = "Green"
print(fruitColors) // ["Apple": "Green", "Banana": "Yellow"]

// 新しいキーと値の追加
fruitColors["Orange"] = "Orange"
print(fruitColors) // ["Apple": "Green", "Banana": "Yellow", "Orange": "Orange"]

GPT先生にポケモンで例えるとどうなるって聞いた結果: