当前位置:  开发笔记 > IOS > 正文

Swift,如何实现基于对象引用的Hashable协议?

如何解决《Swift,如何实现基于对象引用的Hashable协议?》经验,为你挑选了2个好方法。

在Java之后我开始学习swift.在Java中,我可以使用任何对象作为HashSet的键,因为它具有默认值hashCodeequals基于对象标识符.如何在Swift中实现相同的行为?



1> Aaron Rasmus..:

如果您正在使用类而不是结构,则可以使用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 4.2开始,您必须实现`func hash(into hasher:inout Hasher)'而不是`hashValue`,所以它看起来像:`func hash(into hasher:inout Hasher){return hasher.combine(ObjectIdentifier(self) )`

2> kgaidis..:

在Swift中,类型必须符合HashableEquatable要在诸如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 {

}

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有