web-dev-qa-db-ja.com

構造体をハッシュ可能にしますか?

ソート[petInfo : UIImage]()の辞書を作成しようとしていますが、エラーが発生していますType 'petInfo' does not conform to protocol 'Hashable'。私のpetInfo構造体はこれです:

struct petInfo {
    var petName: String
    var dbName: String
}

だから私はどういうわけかそれをハッシュ可能にしたいが、そのコンポーネントのどれもvar hashValue: Intが必要です。フィールドが整数でない場合、プロトコルに準拠させるにはどうすればよいですか?この構造体のすべての出現に対して一意であることがわかっている場合、dbNameを使用できますか?

30
MarksCode

hashValue関数からdbName.hashValueを返すだけです。参考までに、ハッシュ値は一意である必要はありません。要件は、等しいと等しい2つのオブジェクトも同じハッシュ値を持つ必要があることです。

struct PetInfo: Hashable {
    var petName: String
    var dbName: String

    var hashValue: Int {
        return dbName.hashValue
    }

    static func == (lhs: PetInfo, rhs: PetInfo) -> Bool {
        return lhs.dbName == rhs.dbName && lhs.petName == rhs.petName
    }
}
46
rmaddy

Swift 5 _var hashValue:Int_はfunc hash(into hasher: inout Hasher)の代わりに廃止されました(Swift 4.2)で導入されたため) @rmaddyが与えた答え:

_func hash(into hasher: inout Hasher) {
    hasher.combine(dbName.hashValue)
}
_
1
ChrisH