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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:06:42