我不明白以下情况:
let a1: [[Double]] = [[1]]
let equ1 = a1 == a1 // This builds
let t1: (Double, Double) = (1, 1)
let equ2 = t1 == t1 // This builds also
let a2: [[(Double, Double)]] = [[(1,1)]]
let equ3 = a2 == a2 // This gives a build error
构建错误是
Binary operator '==' cannot be applied to two '[[(Double, Double)]]' operands
Double
为什么我可以检查2 的元组的二维数组是否相等Doubles
,但不能检查这个元组的二维数组是否相等?
这是预期的行为。让我们分解一下每种情况:
您正在比较 double 的二维数组,并且由于 Double 符合协议
Equatable
(==
在本场景中),因此该数组也完全符合Equatable
协议,这使得它能够进行比较。您可能需要查看此文档。SE-0015,Swift 2.2.1 表示您可以使用
==
函数比较最多 6 个元素的元组。到目前为止,元组还不能遵循任何协议。即使里面的每个元素都可以,但这并不意味着整个元组都可以。我发现这个PR-46668也问了和你一样的问题。
站点说明:您可能希望将其包装成
Struct
或Class
,例如:即使元素符合 Equatable,元组作为一种类型也不符合 Equatable,编译器支持比较包含最多 6 个元素的元组是否相等,但这与符合 Equatable 协议并不相同。
并且,Array 对象仅当其元素符合 Equatable 时才符合 Equatable,但这里的情况并非如此。
因此,无论是您的元组数组还是简单的元组数组都无法与开箱即用的 Equatable 进行比较。