快速提示:懒惰序列

SequenceTypeCollectionType具有一个很酷的名为lazy属性。 Apple将lazy定义为:“一个包含与该序列相同的元素的序列,但是在其上懒惰地实现了某些操作,例如mapfilter 。”

最好用一个例子来说明。 假设我们有以下代码:

  //创建一个包含1到1,000的数字的数组。 
变数= [Int]()
数字+ = 1…1_000
 让newNumbers =数字 
.filter {$ 0%2!= 0} //已执行1,000次
.map {$ 0 * 10} //执行500次
 打印(“ \(newNumbers.last)”) 

如果要访问newNumbers的最后一个元素或任何元素,则必须执行构建newNumbers数组所需的每一个计算。 那是`filter`的1000次迭代,而map另外500次。 现在,更懒惰的:

  //创建一个包含1到1,000的数字的数组。 
变数= [Int]()
数字+ = 1…1_000
 让newNumbers = numbers.lazy 
.filter {$ 0%2!= 0} //仅执行3次
.map {$ 0 * 10} //仅执行1次
 打印(“ \(newNumbers.last)”) 

这次,我们只完成了filter三个迭代,以及map一个迭代。

因为我们使用了lazy序列属性,所以实际上返回了一个新类型( LazyMapBidirectionalCollection ),而不是简单的数组。 同样重要的是要注意,惰性计算不会被缓存。 每次您以惰性顺序访问元素时,都会重新计算该元素。 这些有时有时很难调试,因此一个有用的技巧是将print($0)语句放入闭包内。

下周一加入我们,参加本系列的最后一篇文章。 我们将分享一些有关在Swift项目中调试缓慢构建时间的建议。