快速提示:懒惰序列
SequenceType
和CollectionType
具有一个很酷的名为lazy
属性。 Apple将lazy
定义为:“一个包含与该序列相同的元素的序列,但是在其上懒惰地实现了某些操作,例如map
和filter
。”
最好用一个例子来说明。 假设我们有以下代码:
//创建一个包含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项目中调试缓慢构建时间的建议。
- 错误:致命的:不是一个混帐存储库(或任何父目录):.git
- 在模拟器中无法使用MFMailComposeViewController发送电子邮件
- 在尝试将Googlelogin集成到我的应用中时无法find“GoogleService-Info.plist”
- 如何将静态TableView添加到ViewController
- 不能在swift中转换AnyHashable 3
- 我怎么能在viewDidLoad做UIView animateWithDuration? IOS 7
- iOS 4的Circumvent截图
- 如何使用Storyboard将UISegmentedControl添加到我的UIToolbar?
- fbDidLogin未被调用 – iOS