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

Swift泛型二维数组的Array扩展方法实现问询

搞定Swift二维数组转置的泛型扩展写法

嘿,这就给你明确正确的类型约束和返回值写法,直接上能用的代码,再给你拆解细节:

extension Array where Element: Collection {
    public func transposed() -> [[Element.Element]] {
        guard let firstRow = first else { return [] }
        
        // 按原数组的列数遍历,把每一列转成新数组的一行
        return firstRow.indices.map { columnIndex in
            self.map { row in
                row[columnIndex]
            }
        }
    }
}

核心细节拆解:

  • 类型约束 Element: Collection:
    外层数组是Array,我们需要它的元素(也就是内层的子数组)支持索引、遍历这些操作,Collection协议刚好满足这些要求。用这个约束的好处是,不仅[[Int]]这种纯数组的二维结构能用,只要内层是遵循Collection的类型(比如ContiguousArray),这个方法都能生效,适用性拉满。要是你只想限定内层必须是Array,也可以把约束改成Element: Array,不过还是Collection更灵活。

  • 返回值 [[Element.Element]]:
    拿[[Int]]举例,这里的Element就是[Int],Element.Element就是最内层的Int,所以返回值自然是[[Int]],完美匹配转置后的类型。本质上,返回值的内层元素类型和原数组的最内层元素完全一致,外层还是用数组包裹成二维结构。

小补充:

这个实现默认你的二维数组是规则的矩形数组(所有子数组长度相同),如果是不规则的数组(比如有的行短有的行长),可以额外加个逻辑,比如取所有行里最短的长度来做转置,避免出现下标越界的问题。

内容的提问来源于stack exchange,提问作者andrewz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:14