为什么懒惰在这里使用?
extension SequenceType { func mapSome<U>(transform: Generator.Element -> U?) -> [U] { var result: [U] = [] for case let x? in lazy(self).map(transform) { result.append(x) } return result } }
此扩展使用返回可选的转换函数,并返回仅包含未转换为nil的值的数组
为什么不使用self.map(转换)?这里有懒惰吗?
它避免了创建中间数组.
self.map(transform)
返回一个包含转换结果的数组
所有序列元素,然后遍历以构建
结果数组包含非零元素.
lazy(self).map(transform)
是一系列变换后的元素,然后是
迭代以获得非零元素.转化的元素
在枚举期间计算. (每次拨打下一个()
懒惰序列通过转换下一个元素产生一个元素
原始序列的元素.)
两种方法都有效.懒惰的方法可能会表现得更好对于大型序列,但这可能取决于许多因素(大小对于数组,无论元素是值还是引用类型,复制数组元素的成本是多少等).适用于小型阵列懒惰的方法可能会因为额外的而变慢高架.在具体的应用程序中,使用Instruments进行分析帮助决定使用哪种方法.