如何无显式for循环从函数数组获取首个非nil的T类型映射结果
无显式循环单次遍历实现方案
核心利用Swift标准库的惰性序列(LazySequence) 特性,配合内置方法实现要求,不需要手写显式for循环,天然保证找到第一个非nil值就终止遍历,最坏时间复杂度O(n)。
核心实现代码
假设你需要传入所有函数的Int类型参数为固定值(示例中命名为inputValue),实现只需要两行链式调用:
// 替换为你实际要传入每个函数的Int参数 let inputValue = 10 let firstValidResult: T? = array.lazy .compactMap { $0(inputValue) } .first
实现逻辑说明
lazy关键字会将后续的序列操作转为按需执行模式,不会提前把数组里所有函数都执行一遍生成中间数组,而是逐个取出函数执行compactMap负责过滤每个函数的返回值,自动丢弃nil结果first方法拿到第一个非nil的返回值后会立刻终止整个遍历流程,数组中排在后面的函数根本不会被调用,完全满足单次遍历、提前退出的要求- 如果所有函数都返回nil,最终
firstValidResult的值为nil,符合预期
避坑提醒
不要省略lazy直接写array.compactMap { $0(inputValue) }.first:这种写法会先执行数组里的所有函数,生成完整的非nil结果数组后再取第一个元素,哪怕第一个函数就返回非nil值,后面的函数依然会全部执行,存在大量无意义的性能损耗。
如果需要频繁调用,可以直接封装成数组扩展方法:
extension Array { func firstNonNilResult<T>(input: Int) -> T? where Element == (Int) -> T? { self.lazy.compactMap { $0(input) }.first } } // 调用示例 let result = array.firstNonNilResult(input: 10)
内容的提问来源于stack exchange,提问作者tereks
相关产品推荐
相关产品推荐

