实现 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))
注意 :自定义类型中的不同值不必具有不同的哈希值,冲突是可接受的。如果哈希值相等,则使用相等运算符来确定实际相等性。