2017-02-01 19 views
19

Tôi đang cố tạo một từ điển loại [petInfo : UIImage]() nhưng tôi gặp lỗi Type 'petInfo' does not conform to protocol 'Hashable'. petInfo struct của tôi là thế này:Tạo cấu trúc Hashable?

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

Vì vậy, tôi muốn bằng cách nào đó làm cho nó hashable nhưng không ai trong số các thành phần của nó là một số nguyên đó là những gì các var hashValue: Int yêu cầu. Làm thế nào tôi có thể làm cho nó phù hợp với giao thức nếu không có trường nào của nó là số nguyên? Tôi có thể sử dụng dbName nếu tôi biết nó sẽ là duy nhất cho tất cả các lần xuất hiện của cấu trúc này?

Trả lời

29

Chỉ cần trả lại dbName.hashValue từ hàm hashValue của bạn. FYI - giá trị băm không cần phải là duy nhất. Yêu cầu là hai đối tượng bằng nhau phải có cùng giá trị băm.

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 
    } 
} 
+0

Rất vui được biết! Bạn có nhớ giải thích điều 'tĩnh func' mà bạn đã thêm vào không? – MarksCode

+0

Hashable extends Equatable. Xem tài liệu cho hai giao thức để có giải thích đầy đủ về hàm '=='. – rmaddy

Các vấn đề liên quan