实现 Hashable 协议

SetsDictionaries(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))

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