You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何二维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,自然无法使用==比较。

解决办法

如果需要对这类嵌套元组数组判等,有两种常见方案:

  1. 把元组换成遵循Equatable的结构体:
    struct Pair: Equatable {
        let first: Double
        let second: Double
    }
    let a2: [[Pair]] = [[Pair(first: 1, second: 1)]]
    let equ3 = a2 == a2 // 正常编译
    
  2. 手动为一维元组数组实现==运算符:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:22:11