Swift 2.0在包含NSObject子类时设置不正常
发布时间:2020-12-14 05:27:22 所属栏目:百科 来源:网络整理
导读:将我们的代码库升级到 Swift2后,我遇到了异常的问题. Set不是预期的减法或联合. class A: NSObject { let h: Int init(h: Int) { self.h = h } override var hashValue: Int { return h }}func ==(lhs: A,rhs: A) - Bool { return lhs.hashValue == rhs.hash
将我们的代码库升级到
Swift2后,我遇到了异常的问题. Set不是预期的减法或联合.
class A: NSObject { let h: Int init(h: Int) { self.h = h } override var hashValue: Int { return h } } func ==(lhs: A,rhs: A) -> Bool { return lhs.hashValue == rhs.hashValue } let a = A(h: 1) let b = A(h: 1) var sa = Set([a]) let sb = Set([b]) sa.subtract(sb).count // Swift1.2 prints 0,Swift 2 prints 1 sa.contains(a) // Swift1.2 true,Swift 2 true sa.contains(b) // Swift1.2 true,Swift 2 false 看起来新的Set没有使用hashValue进行内部操作.任何想法是一个错误,或解决这个问题的方法?
我玩了你的代码了一下.我能够通过不再继承NSObject来使其工作,而是符合Hashable协议:
class A: Hashable { let h: Int init(h: Int) { self.h = h } var hashValue: Int { return h } } func ==(lhs: A,Swift 2 false a.hashValue == b.hashValue 当您从NSObject继承时,您的==重载实际上并未执行.如果你想让它与NSObject一起使用,你必须覆盖isEquals: override func isEqual(object: AnyObject?) -> Bool { if let object = object as? A { return object.h == self.h } else { return false } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |