Dictionaryは、Swiftの関連コンテナであり、「キー-バリュー」ペアを保存します。キーは一意性を保証し、要素への定数時間アクセスを確保するために、HashableおよびEquatableプロトコルを実装する必要があります。
特性:
HashableおよびEquatableが明示的に実装されている場合に可能です。例:
struct EmployeeID: Hashable { let company: String let id: Int } var employees: [EmployeeID: String] = [ EmployeeID(company: "A", id: 1): "Alice", EmployeeID(company: "B", id: 2): "Bob" ] let empName = employees[EmployeeID(company: "A", id: 1)] // Alice
Dictionaryは、Hashableを実装していないカスタムタイプをキーとして受け入れることができますか?
— 不正解です。タイプがHashableを実装していない場合、キーとして使用できません。使用しようとするとコンパイルエラーが発生します。
例:
class Foo {} var dict: [Foo: Int] = [:] // エラー: FooはHashableを実装していません
物語
プロジェクトでは、内部に配列を持つ構造体に基づいたDictionaryのキーを保存していました。構造体はHashableプロトコルを満たさず、Dictionaryが機能しませんでした。解決策:すべてのフィールド(配列を含む)を考慮した独自のhashValueを実装すること。
物語
オブジェクトのアドレスに依存して、キーとしてNSObjectのサブクラスを使用していました。構造体にコードの一部を書き換えた後、データが一致しなくなりました:構造体のハッシュ値が異なる方法で計算され、データの可用性が失われました。
物語
複雑なキーを持つ辞書を保存する際にEquatableを実装し忘れました。その結果、同じパラメータを持つ要素が異なるキーと見なされ、重複や辞書検索時のエラーが発生しました。