我在 Swift 4.0 的 Playground 中有一个非常简单的类,它覆盖了 == 运算符。
我不明白为什么当类继承/不继承Equatable协议时 Swift 编译器的行为不一样。
这里是继承 Equatable 协议时的类
class Test: Equatable {
var value = 0
init(_ initialValue:Int) {
value = initialValue
}
static func == (lhs:Test, rhs:Test) -> Bool {
return lhs.value == rhs.value ? true : false
}
}
let test1 = Test(0)
var test4:Test? = nil
if test1 == test4 {
print("test1 and test4 are equals")
} else {
print("test1 not equals to test4")
}
当此代码执行时,它显示“test1 not equals to test4”。这是预期的行为。
接下来,当我从类中删除“Equatable”协议时
class Test {
var value = 0
init(_ initialValue:Int) {
value = initialValue
}
static func == (lhs:Test, rhs:Test) -> Bool {
return lhs.value == rhs.value ? true : false
}
}
let test1 = Test(0)
let test3 = Test(0)
var test4:Test? = nil
if test1 == test4 {
print("test1 and test4 are equals")
} else {
print("test1 not equals to test4")
}
我得到一个编译错误就行了
if test1 == test4 {
带有以下消息:“可选类型'测试的值?' 未解包;您的意思是使用“!”还是“?”?
为什么有/没有 Equatable 的行为不同?
事实上,当类从 Equatable 继承时,我也期待同样的编译错误,因为我将非可选与可选进行了比较。
当类继承 Equatable 时,将非可选与可选进行比较是否安全?