Swift中的Hashable
协议要求您实现名为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
之间的区别是什么?
答案 0 :(得分:34)
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?。)
所以NSObject
(和所有子类)符合Hashable
协议和默认的hashValue
实现
返回对象的hash
属性。
isEqual
方法之间存在类似的关系
NSObject
协议以及==
中的Equatable
运算符
协议:NSObject
(和所有子类)符合Equatable
协议和默认的==
实现
在操作数上调用isEqual:
方法。