Swift中未包装的可选数组的相等性

时间:2014-06-17 10:00:34

标签: swift

我认为以下是一个错误,并已提交雷达报告 (#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

这是真的。

我错过了什么?看起来有一些特殊的魔法发生时 新任务已经完成,但为什么呢?

感谢您的帮助,或者如果您无法帮助,那么感谢您的同意。 ; - )

1 个答案:

答案 0 :(得分:0)

这是一个错误

a2 == b!trueb! == a2false,这没有任何意义

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,这显然是不正确的,因为它比较指针相等而不是内容相等。