2016-08-14 2 views
16

Hashable Протокол в Swift требует, чтобы реализовать свойство hashValue:разница между хэш Свифта и значением хэш

protocol Hashable : Equatable { 
    /// Returns the hash value. The hash value is not guaranteed to be stable 
    /// across different invocations of the same program. Do not persist the hash 
    /// value across program runs. 
    /// 
    /// The value of `hashValue` property must be consistent with the equality 
    /// comparison: if two values compare equal, they must have equal hash 
    /// values. 
    var hashValue: Int { get } 
} 

Тем не менее, кажется, есть также аналогичное свойство называется hash.

В чем разница между hash и hashValue?

+3

'hash' является свойством протокола' 'NSObject' '(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/), сравните [подкласс NSObject in Swift: hash vs hashValue, isEqual vs ==] (http://stackoverflow.com/questions/33319959/nsobject-subclass-in-swift-hash-vs-hashvalue-isequal-vs). –

ответ

23

hash - это обязательное свойство в NSObject protocol, которое группирует методы, которые являются фундаментальными для всех объектов Objective-C, поэтому предшествует Swift. Реализация по умолчанию просто возвращает адрес объектов, , как можно видеть в NSObject.mm, но можно отменить собственность в NSObject подклассах.

hashValue является обязательным условием протокола Swift Hashable.

Оба подключены через NSObject расширения, определенного в Swift стандартной библиотеки в ObjectiveC.swift:

extension NSObject : Equatable, Hashable { 
    /// The hash value. 
    /// 
    /// **Axiom:** `x == y` implies `x.hashValue == y.hashValue` 
    /// 
    /// - Note: the hash value is not guaranteed to be stable across 
    /// different invocations of the same program. Do not persist the 
    /// hash value across program runs. 
    open var hashValue: Int { 
    return hash 
    } 
} 

public func == (lhs: NSObject, rhs: NSObject) -> Bool { 
    return lhs.isEqual(rhs) 
} 

(Для значения open var см What is the 'open' keyword in Swift?.)

So NSObject (и все подклассы) соответствуют протоколу Hashable , а реализация hashValue по умолчанию возвращает hash свойства объекта.

Аналогичная зависимость существует между isEqual методом протокола NSObject, и == оператором из Equatable протокола: NSObject (и всех подклассов) соответствовать протоколу Equatable и реализацией по умолчанию == называет isEqual: метод на операндах.