實現 Hashable 協議
Sets
和 Dictionaries(key)
中使用的型別必須符合 Hashable
協議,該協議繼承自 Equatable
協議。
必須實現符合 Hashable
協議的自定義型別
- 計算屬性
hashValue
- 定義一個相等運算子,即
==
或!=
。
以下示例為自定義 struct
實現 Hashable
協議:
struct Cell {
var row: Int
var col: Int
init(_ row: Int, _ col: Int) {
self.row = row
self.col = col
}
}
extension Cell: Hashable {
// Satisfy Hashable requirement
var hashValue: Int {
get {
return row.hashValue^col.hashValue
}
}
// Satisfy Equatable requirement
static func ==(lhs: Cell, rhs: Cell) -> Bool {
return lhs.col == rhs.col && lhs.row == rhs.row
}
}
// Now we can make Cell as key of dictonary
var dict = [Cell : String]()
dict[Cell(0, 0)] = "0, 0"
dict[Cell(1, 0)] = "1, 0"
dict[Cell(0, 1)] = "0, 1"
// Also we can create Set of Cells
var set = Set<Cell>()
set.insert(Cell(0, 0))
set.insert(Cell(1, 0))
注意 :自定義型別中的不同值不必具有不同的雜湊值,衝突是可接受的。如果雜湊值相等,則使用相等運算子來確定實際相等性。