
func ==(lhs: MyObject,rhs: MyObject) -> Bool { return lhs.IDentifIEr == rhs.IDentifIEr} 对于类似这样的类:
class MyObject: NSObject { let IDentifIEr: String init(IDentifIEr: String) { self.IDentifIEr = IDentifIEr }} 这在Swift 1.2及以下版本中工作正常.它还有一些作品:
let myObject1 = MyObject(IDentifIEr: "A")let myObject2 = MyObject(IDentifIEr: "A")let result = (myObject1 == myObject2)// result is true
到目前为止这么好,但是如果两个变量都是可选的呢?
let myObject1: MyObject? = MyObject(IDentifIEr: "A")let myObject2: MyObject? = MyObject(IDentifIEr: "A")let result = (myObject1 == myObject2)// result is false,equals operator was never even called
另外还有一件事情不再奏效:
let myObject1 = MyObject(IDentifIEr: "A")let myObject2 = MyObject(IDentifIEr: "A")let result = (myObject1 == myObject2)// result is truelet result = (myObject1 != myObject2)// result is true,equals operator was never even called
显然,!=不再调用==运算符并且否定它.似乎只是比较实例而不是使用!=
所有这一切只发生在你的类是NSObject的子类(直接或间接)时.如果不是这样,一切都像你所期望的那样工作.
任何人都可以告诉我,这是Swift 2.0中的新功能还是只是一个讨厌的BUG?
不幸的是,我不知道这是否被认为是一个功能(我不这么认为).如果任何类子类符合Equatable的类(如NSObject;它比较实际实例),则会发生此问题.所以如果你只是“覆盖”所有其他运算符的子类的==运算符,如:func !=<T : Equatable>(lhs: T,rhs: T) -> Boolfunc ==<T : Equatable>(lhs: T?,rhs: T?) -> Boolfunc ==<T : Equatable>(lhs: [T],rhs: [T]) -> Bool
其中T被限制为Equable Swift使用baseclass的==运算符.作为(耗时)解决方法,您可以重载所有必须使用的等式运算符,如下所示:
func !=(lhs: MyObject,rhs: MyObject) -> Bool { ... }func ==(lhs: MyObject?,rhs: MyObject?) -> Bool { ... }func ==(lhs: [MyObject],rhs: [MyObject]) -> Bool { ... } 编辑:原因
这种行为的原因是如果一个子类符合Equatable,那么自我需求的自我就被确定为这个类.所以每次使用符合Equatable的(泛型)类型调用==它只调用初始符合类的运算符.
总结以上是内存溢出为你收集整理的相等 – 在Swift 2.0中使用equals运算符和NSObjects的Bug?全部内容,希望文章能够帮你解决相等 – 在Swift 2.0中使用equals运算符和NSObjects的Bug?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)