这里的问题是具有以下特征的事物之间的区别:==
运算符,而不是“可等同的”东西。
Both Optional
and Array
有一个==
运算符,当它们包含的内容相等时才起作用:
// if T is equatable, you can compare each entry for equality
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool
// if T is equatable, you can compare the contents, if any, for equality
func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
let i: Int? = 1
let j: Int = 1
i == j // fine, Int is Equatable
["a","b"] == ["a","b"] // and so is String
但他们本身并不符合Equatable
。鉴于您可以在其中放入不相等的类型,这是有道理的。但这样做的结果是,如果一个数组包含一个不可等式的类型,那么==
行不通。由于选项不是Equatable
,当您将可选值放入数组中时就会出现这种情况。
如果你尝试比较数组的数组,你会得到同样的结果:
let a = [[1,2]]
let b = [[1,2]]
a == b // error: `==` can’t be applied to `[Array<Int>]`
如果你想特殊情况,你可以写==
对于可选数组,如下所示:
func ==<T: Equatable>(lhs: [T?], rhs: [T?]) -> Bool {
if lhs.count != rhs.count { return false }
for (l,r) in zip(lhs,rhs) {
if l != r { return false }
}
return true
}
举个反例,因为Set
要求其内容可散列(因此可等同),它can可等同:
let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,2,3],[4,5,6]] // true