Read

序列

一个序列 (sequence) 代表的是一系列具有相同类型 的值,你可以对这些值进行迭代。遍历一个序列最简单的方式是使用 for 循环:

1
2
3
for element in someSequence { 
doSomething(with: element)
}

满足 Sequence 协议的要求十分简单,你需要做的所有事情就是提供一个返回迭代器 (iterator) 的 makeIterator() 方法:

1
2
3
4
5
protocol Sequence {
associatedtype Iterator: IteratorProtocol
func makeIterator() -> Iterator
// ...
}

迭代器

序列通过创建一个迭代器来提供对元素的访问。迭代器每次产生一个序列的值,并且当遍历序 列时对遍历状态进行管理。在 IteratorProtocol 协议中唯一的一个方法是 next(),这个方法需 要在每次被调用时返回序列中的下一个值。当序列被耗尽时,next() 应该返回 nil:

我们一般不管心迭代器是如何工作的, 除非你自定义一个序列类型的时候需要。for 循环在背后: 编译器会自动为序列生成一个迭代器, 并且不断的调用 next 方法, 直到返回 nil。

1
2
var iterator = someSequence.makeIterator() while let element = iterator.next() {
doSomething(with: element) }

迭代器是单向结构,它只能按照增加的方向前进,而不能倒退或者重置。虽然大部分的迭代器 的 next() 都只产生有限数量的元素,并最终会返回 nil,但是你也完全可以创建一个无限的,永 不枯竭的序列。实际上,除了那种一上来就返回 nil 的迭代器,最简单的情况应该是一个不断返 回同样值的迭代器了:

1
2
3
4
5
6
struct ConstantIterator: IteratorProtocol {
typealias Element = Int
mutating func next() -> Int? {
return 1
}
}

typealias 其实不需要写, 这里为了代码的可读性好, 就写出来了。 其实 next 的返回值可以推断出 Element 的类型为 Int。

注意这里 next() 被标记为了 mutating。对于我们这个简单的例子来说,我们的迭代器不包含任 何可变状态,所以它并不是必须的。不过在实践中,迭代器的本质是存在状态的。几乎所有有 意义的迭代器都会要求可变状态,这样它们才能够管理在序列中的当前位置。

我们来看一个更有意义的例子。FibsIterator 迭代器可以产生一个斐波那契序列。它将记录接
下来的两个数字,并作为状态存储,next 函数做的事情是为接下来的调用更新这个状态,并且 返回第一个数。和之前的例子一样,这个迭代器也将产生 “无穷” 的数字,它将持续累加数字, 直到程序因为所得到的数字发生类型溢出而崩溃 (我们暂时先不考虑这个问题):

遵守序列协议

我们也可以创造有限序列的迭代器,比如下面这个 Pre

Swift 进阶 第 4 课 集合类型协议的更多相关文章

  1. Swift 里集合类型协议的关系

      Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议,可以通过迭代来获取它的元素 ...

  2. [Swift通天遁地]五、高级扩展-(2)扩展集合类型

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. Welcome-to-Swift-04集合类型(Collection Types)

    Swift提供了两种集合类型来存放多个值——数组(Array)和字典(Dictionary).数组把相同类型的值存放在一个有序链表里.字典把相同类型的值存放在一个无序集合里,这些值可以通过唯一标识符( ...

  4. swift 集合类型(二)

    说到swift的集合类型,就不得不谈到Dictionary.包含一个键值对组合的集合. var air = ["name":"warner","tit ...

  5. Swift中的集合类型

    一.引子: 在2014年10月TIOBE编程语言排行榜中,Swift位居第18位,从2014WWDC发布会首次公布至今不到半年时间,swift一直受到编程人 员的追捧,其热衷程度并不亚于当红巨星Tay ...

  6. Swift学习笔记(5):集合类型

    目录: 数组:Array 集合:Set 字典:Dictionary Swift提供Array(有序集合数据).Set(无序无重复集合)和Dictionary(无序键值对集合)三种基本集合类型来存储明确 ...

  7. 浅谈Swift集合类型

    Swift 的集合表现形式由数组和字典组成.它可以完美的存储任何呢想存储的东西. 数组是一个同类型的序列化列表集合,它用来存储相同类型的不同值.字典也是一个数组,但它的存值方式类似于Map,通过一对一 ...

  8. 【Swift学习】Swift编程之旅---集合类型之数组(六)

    swift提供了3种主要的集合类型,array,set,dictionary.本节介绍array. 数组是存储有序的相同类型的集合,相同的值可以多次出现在不同的位置. 注意: swift的Array类 ...

  9. Swift 集合类型

     Swift语言提供数组和字典的集合类型  Swift 语言里的数组和字典中存储的数据值类型必须明确 ,即数组中只能存放同类型的数据. 1: 数组 数组的创建 var shoppingList: St ...

随机推荐

  1. 架构之道(5) - APP和Web的后台架构

    当一个项目,同时需要Web.手机H5.Android,三平台同时可以测览,那就需要很简洁而有力的架构. 而我这就经历了这麽一个项目,先开发网站,然后是手机H5,最后是Android. 自信男人,无须多 ...

  2. 【python】两行代码实现近百年的正反日期查询--20200202

    到2020年了.有个日期也火了,记得上一次还是2011年11月2日.为啥捏,因为日期写成数字形式 正反是一样的. 2020年也有一个这样的日期.20200202:2020年2月2日. 于是乎想写一段代 ...

  3. 阿里云 asp.net core nginx 单机部署

    1. dotnet core 安装 https://www.microsoft.com/net/download#core 安装之前要安装依赖:yum install libunwind libicu ...

  4. 表查询语句及使用-连表(inner join-left join)-子查询

    一.表的基本查询语句及方法 from. where. group by(分组).having(分组后的筛选).distinct(去重).order by(排序).  limit(限制) 1.单表查询: ...

  5. kotlin 单例模式

    class Single{ companion object { val instance:Single by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZE ...

  6. PyTorch基础——使用神经网络识别文字中的情感信息

    一.介绍 知识点 使用 Python 从网络上爬取信息的基本方法 处理语料"洗数据"的基本方法 词袋模型搭建方法 简单 RNN 的搭建方法 简单 LSTM 的搭建方法 二.从网络中 ...

  7. Random variable

    \(\underline{cdf:}\)cumulative distribution function \(F(x)=P(X \leq x)\) \(\underline{pmf:}\)probab ...

  8. Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2

    Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 ...

  9. 常用的GIT

    # 初始化相关 git init git add . git commit -m "test001" git remote origin https://github.com/fa ...

  10. 复习break、continue、while、do-while的运用

    一.复习: 循环.反复执行某段语句一种语法形式. 1.基本语法: for( 初始条件 ; 循环条件 ; 状态的改变 ) { 循环体 } 循环的四要素. 循环的执行过程.初始条件--循环条件--循环体- ...