Swift优化咨询:统计可选整数数组指定索引内非nil元素数量
更符合Swift风格的实现方案
你的需求是统计可选整数数组中从起始位置到指定索引(包含该索引)范围内的非nil元素数量,原代码存在越界崩溃的风险,这里提供几种更Swift化且更安全的实现方式:
方式一:用compactMap简化计数
compactMap会自动过滤数组中的nil元素并返回非可选值的数组,搭配prefix能确保不会越界(prefix(index+1)表示取前index+1个元素,会自动适配数组实际长度):
func getValuesCount(upTo index: Int, in values: [Int?]) -> Int { values.prefix(index + 1).compactMap { $0 }.count }
方式二:用reduce高效计数
如果不想创建中间数组,reduce可以直接累加非nil元素的数量,在处理大型数组时性能更优:
func getValuesCount(upTo index: Int, in values: [Int?]) -> Int { values.prefix(index + 1).reduce(0) { result, element in result + (element != nil ? 1 : 0) } }
也可以简化成更紧凑的闭包写法:
func getValuesCount(upTo index: Int, in values: [Int?]) -> Int { values.prefix(index + 1).reduce(0) { $0 + ($1 != nil ? 1 : 0) } }
关键优化点
- 避免越界崩溃:原代码中
values[0...index]当index >= values.count时会直接崩溃,prefix(index+1)会自动截断为数组实际长度,安全性更高。 - 语义更清晰:
prefix明确表达“取前N个元素”的意图,比手动写范围切片更易读。 - 贴合Swift风格:利用标准库的高阶函数替代手动遍历,代码更简洁,契合Swift的函数式编程习惯。
内容的提问来源于stack exchange,提问作者Thomas H.
相关产品推荐
相关产品推荐

