在Java之后我开始学习swift.在Java中,我可以使用任何对象作为HashSet的键,因为它具有默认值hashCode
并equals
基于对象标识符.如何在Swift中实现相同的行为?
如果您正在使用类而不是结构,则可以使用ObjectIdentifier
结构.请注意,您还必须==
为您的类定义以符合Equatable
(Hashable
要求它).它看起来像这样:
class MyClass: Hashable { } func ==(lhs: MyClass, rhs: MyClass) -> Bool { return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) } class MyClass: Hashable { var hashValue: Int { return ObjectIdentifier(self).hashValue } }
在Swift中,类型必须符合Hashable
且Equatable
要在诸如a Dictionary
或a 的数据结构中使用Set
。但是,可以使用对象的“对象标识符”添加“自动一致性”。在下面的代码中,我实现了一个可重用的类来自动执行此操作。
注意,Swift 4.2更改了Hashable
实现方式,因此您不再覆盖hashValue
。相反,您可以覆盖hash(into:)
。
open class HashableClass { public init() {} } // MARK: -extension HashableClass: Hashable { public func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self).hashValue) } // `hashValue` is deprecated starting Swift 4.2, but if you use // earlier versions, then just override `hashValue`. // // public var hashValue: Int { // return ObjectIdentifier(self).hashValue // } } // MARK: - extension HashableClass: Equatable { public static func ==(lhs: HashableClass, rhs: HashableClass) -> Bool { return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) } }
要使用,只需带上您的类和子类HashableClass
,然后一切都应该正常工作!
class MyClass: HashableClass { }