Swift如何将数组拆分为每组含n个元素的子数组?
Swift 数组按固定长度拆分的优化实现
你已经实现的stride方案本身是高效且正确的,这里提供几种更符合Swift风格、可复用性更强的优化实现方式:
1. 封装为Sequence扩展(推荐)
把拆分逻辑封装成Sequence的扩展,让所有序列类型(Array、Set、String等)都能直接调用,代码更简洁且复用性高:
extension Sequence { func split(intoChunksOf chunkSize: Int) -> [[Element]] { guard chunkSize > 0 else { return [] } return stride(from: 0, to: count, by: chunkSize) .map { let start = index(startIndex, offsetBy: $0) let end = index(start, offsetBy: chunkSize, limitedBy: endIndex) ?? endIndex return Array(self[start..<end]) } } } // 使用示例 let array = [1, 2, 3, 4, 5, 6, 7, 8] let subarrays = array.split(intoChunksOf: 3) print(subarrays) // 输出 [[1, 2, 3], [4, 5, 6], [7, 8]]
这个实现基于你原有的stride思路,新增了参数合法性检查,并用index(_:offsetBy:limitedBy:)替代手动计算边界,更安全且符合Swift的API设计规范。
2. 函数式分组写法(简洁但性能略逊)
如果追求代码极简,可以用Dictionary(grouping:)结合索引分组,适合小规模数组场景:
let array = [1, 2, 3, 4, 5, 6, 7, 8] let chunkSize = 3 let subarrays = Dictionary(grouping: array.enumerated(), by: { $0.offset / chunkSize }) .sorted { $0.key < $1.key } .map { $0.value.map { $0.element } } print(subarrays) // 输出 [[1, 2, 3], [4, 5, 6], [7, 8]]
这种写法利用索引整除结果分组,再排序保证顺序,代码短但会额外创建字典和排序,大规模数组下性能不如stride方案。
方案对比
- 你原有的
stride循环写法:性能最优,无额外开销,适合性能敏感场景; - Sequence扩展方案:和原写法性能相当,复用性拉满,是日常开发的首选;
- 分组写法:代码最简洁,但性能略差,适合小规模数据或快速原型开发。
内容的提问来源于stack exchange,提问作者Heuristic
相关产品推荐
相关产品推荐

