實現 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))

注意 :自定義型別中的不同值不必具有不同的雜湊值,衝突是可接受的。如果雜湊值相等,則使用相等運算子來確定實際相等性。