gpt4 book ai didi

swift - 为什么 swift 编译器在有/没有 Equatable 协议(protocol)的情况下对相等运算符的行为不同

转载 作者:搜寻专家 更新时间:2023-11-01 07:07:37 29 4
gpt4 key购买 nike

我在 Swift 4.0 的 Playground 中有一个非常简单的类,它覆盖了 == 运算符。

我不明白为什么当类继承/不继承 Equatable 协议(protocol)时,Swift 编译器的行为不同。

这里是继承Equatable协议(protocol)时的类

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 不等于 test4”。这是预期的行为。

接下来,当我从类中删除“Equatable”协议(protocol)时

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 时,比较非可选和可选是否安全?

最佳答案

有一个== operator

public func ==<T>(lhs: T?, rhs: T?) -> Bool where T : Equatable

它允许比较两个可选值如果基础类型是 Equatable 在您的第一种情况下会调用该运算符

let test1 = Test(0)
var test4:Test? = nil

if test1 == test4 { ... }

(左操作数自动包装成一个可选的。)

如果 Test 不符合 Equatable 则该运算符符合不匹配,因此没有 == 运算符进行两次 Test?操作数。因此编译错误。

关于swift - 为什么 swift 编译器在有/没有 Equatable 协议(protocol)的情况下对相等运算符的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47059252/

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