加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

相等 – 在Swift 2.0中使用equals运算符和NSObjects的Bug?

发布时间:2020-12-14 05:32:29 所属栏目:百科 来源:网络整理
导读:好的,在 Swift 2.0中为NSObject子类编写自己的equals运算符时,发生了一些奇怪的事情,就像这样: func ==(lhs: MyObject,rhs: MyObject) - Bool { return lhs.identifier == rhs.identifier} 对于类似这样的类: class MyObject: NSObject { let identifier:
好的,在 Swift 2.0中为NSObject子类编写自己的equals运算符时,发生了一些奇怪的事情,就像这样:
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 true
let 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) -> Bool
func ==<T : Equatable>(lhs: T?,rhs: T?) -> Bool
func ==<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的(泛型)类型调用==它只调用初始符合类的运算符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读