NSSet 去重技巧:判断自己设置类的相等

作者 : 开心源码 本文共933个字,预计阅读时间需要3分钟 发布时间: 2022-05-12 共183人阅读

问题缘起

Set 有个天然属性,就是放入的元素不能重复,这个特性也被常用于去除重复数据:

var set:Set = ["1", "2", "3", "4", "1", "1"]print("set:\(set)") //输出为:set:["2", "1", "3", "4"]

系统类可以很方便地放入Set,那么自己设置类呢?
假设需要自己设置Person类,有个name属性,这里我们假设名字相同的人只有一个,所以逻辑上name相同的对象,在Set中只能有一个,但对于对象来说,两个实例是不同的指针,是不同的:

class Person {    var name:String    init(name:String) {        self.name = name    }}var x1:Person? = Person(name:"Xishi")var x2:Person? = Person(name:"Xishi")var set:Set<Person?> = [x1, x2]

实际上,以上代码无法通过编译:

'Set' requires that 'Person' conform to 'Hashable'

处理方案

Swift 要求放入Set的类实现Hashable 协议,而Hashable本身又继承了Equatable协议,所以这里要同时实现两个协议:

class Person : Hashable {    var name:String    init(name:String) {        self.name = name    }    public var hashValue : Int {        get {            return self.name.hashValue        }    }    static func ==(lhs: Person, rhs: Person) -> Bool {        return lhs.name == rhs.name    }}
  • public var hashValue : Int是Hashable协议要求的,需要返回能代表对象的哈希值,这里正好利用 String 的哈希值。
  • 看起来怪怪的static func ==(lhs: Person, rhs: Person) -> Bool方法公告是运算符重载,这里把==当作方法名就好了解了,相当于替换了一个名叫==的方法。

这样,放入Set后,就能正常去除重复对象了。

小试验

== 方法改为固定返回 false,看看会发生什么,与你想象中一样吗?

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » NSSet 去重技巧:判断自己设置类的相等

发表回复