hash
是必需的属性NSObject协议 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/,它对所有 Objective-C 对象的基础方法进行了分组,因此它早于 Swift。
默认实现只返回对象地址,
正如人们所看到的NSObject.mm https://opensource.apple.com/source/objc4/objc4-532.2/runtime/NSObject.mm,但可以覆盖该属性
在NSObject
子类。
hashValue
是 Swift 的必需属性Hashable
协议。
两者都通过一个连接NSObject
扩展名定义在
Swift 标准库Objective C.swift https://github.com/apple/swift/blob/master/stdlib/public/SDK/ObjectiveC/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
, see Swift 中的“open”关键字是什么? https://stackoverflow.com/questions/38947101/what-is-an-open-var-in-swift.)
So NSObject
(和所有子类)符合Hashable
协议和默认值hashValue
执行
返回hash
对象的属性。
之间也存在类似的关系isEqual
的方法NSObject
协议,以及==
运营商从Equatable
协议:NSObject
(和所有子类)符合Equatable
协议和默认值==
执行
称为isEqual:
操作数上的方法。