为何二维Double数组、Double元组可判等,二维Double元组数组却不行?
问题解析:为什么包含元组的二维数组无法使用
==判等? 核心原因:Swift对元组的相等性支持是「语法糖」而非协议实现
Swift里的相等性判断依赖Equatable协议,但元组的情况比较特殊:
二维Double数组(
[[Double]])可以判等:
Double本身遵循Equatable,所以一维数组[Double]会自动合成Equatable实现;同理,二维数组的元素是[Double](已符合Equatable),因此[[Double]]也能自动获得Equatable支持,直接用==比较。(Double, Double)元组可以判等:
Swift对固定长度的元组有特殊语法支持——只要元组里的每个元素都遵循Equatable,Swift会临时生成针对这个元组的==实现,但这只是语法层面的便利,元组本身并没有正式遵循Equatable协议。[[(Double, Double)]]无法判等:
数组的自动Equatable合成要求它的元素类型必须正式遵循Equatable协议。由于元组并没有实现Equatable,只是语法上支持==,所以一维元组数组[(Double, Double)]无法自动获得Equatable实现;进而二维数组[[(Double, Double)]]的元素(一维元组数组)也不符合Equatable,自然无法使用==比较。
解决办法
如果需要对这类嵌套元组数组判等,有两种常见方案:
- 把元组换成遵循
Equatable的结构体:struct Pair: Equatable { let first: Double let second: Double } let a2: [[Pair]] = [[Pair(first: 1, second: 1)]] let equ3 = a2 == a2 // 正常编译 - 手动为一维元组数组实现
==运算符:func ==(lhs: [(Double, Double)], rhs: [(Double, Double)]) -> Bool { guard lhs.count == rhs.count else { return false } for (left, right) in zip(lhs, rhs) { if left != right { return false } } return true } // 此时二维数组的元素[(Double, Double)]已经有了==实现,二维数组就能自动合成Equatable let a2: [[(Double, Double)]] = [[(1,1)]] let equ3 = a2 == a2 // 正常编译
内容的提问来源于stack exchange,提问作者Reinhard Männer
相关产品推荐
相关产品推荐

