Collections in Swift 4
在Swift 4中,对原有的Collection体系做了一些简化。为此,通过这个系列,我们重新过一遍和Collection相关的内容。在这个系列里,我们抛开Swift中那些具体的Array,Set,Dictionary不谈,单纯从表达一系列元素这个概念出发,来回顾Swift Collections设计的前前后后,为什么需要Iterator?Index和Iterator的关系和区别是什么?为什么需要Sequence?Collection和Sequence的差别是什么?如何为不同的集合类型设计接口?。通过对这些问题的讨论,你不仅能够通这个系列的内容更好的使用集合类型。还能以一个标准库库设计者的视角,来理解一些你可能平时不太会注意到的细节。从迭代一系列元素开始泊学4K视频 在Swift 4中,对原有的 抛开Swift中那些具体的 这里我们用“一堆数字”这个形式举例便于理解,实际上,作为集合,它表达的是任意一堆对象。 从约束一个最基本的遍历动作开始为了用最简单的形式描述“逐个访问”这个动作,我们可以定义一个 protocol IteratorProtocol { associatedtype Element mutating func next() -> Element? } 其中, 用IteratorProtocol表示无穷序列有了 struct Ones: IteratorProtocol { mutating func next() -> Int? { return 1 } } 这里, var ones = Ones() ones.next() // Optional(1) ones.next() // Optional(1) ones.next() // Optional(1) 虽然例子很简单,但有两点还是值得说一下:
当然,除了这种为了演示而编写的代码之外,我们也可以定义一些有用的Iterator,例如一个Fibonacci序列: struct Fibonacci: IteratorProtocol { private var state = (0,1) mutating func next() -> Int? { let nextNumber = state.0 self.state = (state.1,state.0 + state.1) return nextNumber } } 而用法,和 var fibs = Fibonacci() fibs.next() // Optional(0) fibs.next() // Optional(1) fibs.next() // Optional(1) fibs.next() // Optional(2) 看到这,你就明白为什么我们要让 使用IteratorProtocol表达序列的局限性但是,使用遵从 当然,由于 之所以会有这种问题,是因为我们借用了遍历的当前状态作为了序列的本身。ones也好,fibs也好,都如此。每一次调用next,我们用于记录当前遍历状态的值,恰好生成了我们期望的整个序列。 What's next?为了解决这个问题,我们应该削弱遵循 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 对.lds连接脚本文件的分析
- ruby-on-rails – 使用accepts_nested_attributes_for,has_
- Cocos2d-x 3.0-《微信飞机大战》实现
- Ajax 不支持enctype="multipart/form-data"
- flex4 组件执行顺序
- Notes on <Understanding AJAX: Using JavaScript to Cre
- flex4 is really is slow than flex3
- objective-c – 共享常量定义变量的标准是什么
- Magento:使用ajax更新购物车项目Custom Option
- 在终端中运行Swift构建导致“平台路径”错误