【发布时间】:2017-08-09 02:54:24
【问题描述】:
为什么我必须添加 != 才能使比较正确?
import UIKit
class Person: NSObject {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
extension Person {
static func ==(lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
static func !=(lhs: Person, rhs: Person) -> Bool {
return !(lhs == rhs)
}
}
let first = Person(name: "John", age: 26)
let second = Person(name: "John", age: 26)
/**
* return false (which is correct) when we implement != function. But,
* it will return true if we don't implement the != function.
*/
first != second
更新:
所以我明白了为什么我必须添加!= 函数才能使其工作。这是因为该类继承了NSObject,它在后台使用isEqual 方法。但是为什么添加!= 函数可以让它工作呢?这里有什么解释吗?
【问题讨论】:
-
@Alexander 抱歉,这里的类代码太复杂了。但答案可能很简单,因为我读到这只是新版本 Swift 的新要求,您必须实现
!=才能使其工作。 -
这个假设是错误的。提供了一个默认的
!=实现,它调用!(a == b)。如果您甚至不给我们重新创建问题的方法,我不确定您正在寻找什么样的答案 -
虽然我没有答案,但我很欣赏更新后的问题。你有我的赞成票。
-
比较 stackoverflow.com/a/42286148/2976878 的第 2 点。简而言之,子类不能直接重新实现超类的协议一致性。虽然您的
==实现可以静态 分派到,但它不能动态 分派到(例如从调用@987654333 的标准库的!=运算符实现中) @ 并否定结果)。正如其他人已经说过的那样,您想覆盖isEqual(和hash!)
标签: swift