gpt4 book ai didi

equality - Swift 2.0 中等于运算符和 NSObjects 的错误?

转载 作者:行者123 更新时间:2023-12-02 14:12:39 26 4
gpt4 key购买 nike

好吧,在 Swift 2.0 中为 NSObject 子类编写自己的等于运算符时,会发生一些奇怪的事情,如下所示:

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 中的新“功能”还是只是一个讨厌的错误?

最佳答案

我认为这种行为应该被视为一个错误(从 Xcode 7 beta 6 开始仍然存在),但有一个希望是临时的解决方法:覆盖 NSObject 的 -isEqual 而不是实现 Swift 的 == 运算符。

class MyObject: NSObject {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
override func isEqual(object: AnyObject?) -> Bool {
guard let rhs = object as? MyObject else {
return false
}
let lhs = self

return lhs.identifier == rhs.identifier
}
}

我在这里找到了对该问题的另一个引用,其中包含更多代码示例:http://mgrebenets.github.io/swift/2015/06/21/equatable-nsobject-with-swift-2/

关于equality - Swift 2.0 中等于运算符和 NSObjects 的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com