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
相关产品推荐
相关产品推荐

