我认为以下是一个错误,并已提交雷达报告 (#17340397)。但是,由于Apple没有对bug报告提供太多反馈, 我在这里向更聪明的人询问他们的想法。
考虑一下:
let a: Array<Int>? = [1,2,3]
let b: Array<Int>? = [1,2,3]
a! == b!
那是假的。为什么这是假的?
起初我认为数组比较不会这样,但如果我 首先明确地解开这些,然后它起作用:
let a2 = a!
let b2 = b!
a2 == b2
这是真的。
我错过了什么?看起来有一些特殊的魔法发生时 新任务已经完成,但为什么呢?
感谢您的帮助,或者如果您无法帮助,那么感谢您的同意。 ; - )
答案 0 :(得分:0)
这是一个错误
a2 == b!
为true
但b! == a2
为false
,这没有任何意义
xcrun swift
Welcome to Swift! Type :help for assistance.
1> let a: Array<Int>? = [1]
a: Int[]? = size=1 {
[0] = 1
}
2> let b: Array<Int>? = [1]
b: Int[]? = size=1 {
[0] = 1
}
3> let a2 = a!
a2: Int[] = size=1 {
[0] = 1
}
4> let b2 = b!
b2: Int[] = size=1 {
[0] = 1
}
5>
6> a2 == b!
$R1: Bool = true
7> b! == a2
$R2: Bool = false
8> (a2 == b!) == (b! == a2)
$R3: (Bool) = false
我认为这是由与this question
相同的错误造成的 9> import Foundation
10> a2 == b!
$R9: Bool = true
11> b! == a2
<REPL>:11:4: error: ambiguous use of operator '=='
b! == a2
^
Swift.==:1:19: note: found this candidate
@transparent func ==(lhs: CConstVoidPointer, rhs: CConstVoidPointer) -> Bool
^
Foundation.==:1:6: note: found this candidate
func ==(lhs: NSObject, rhs: NSObject) -> Bool
^
11>
编译器以某种方式选择func ==(lhs: CConstVoidPointer, rhs: CConstVoidPointer) -> Bool
来调用b! == a2
,这显然是不正确的,因为它比较指针相等而不是内容相等。