Swift 进阶 第 4 课 集合类型协议
Read
序列
一个序列 (sequence) 代表的是一系列具有相同类型 的值,你可以对这些值进行迭代。遍历一个序列最简单的方式是使用 for 循环:
1 |
for element in someSequence {
|
满足 Sequence 协议的要求十分简单,你需要做的所有事情就是提供一个返回迭代器 (iterator) 的 makeIterator() 方法:
1 |
protocol Sequence {
|
迭代器
序列通过创建一个迭代器来提供对元素的访问。迭代器每次产生一个序列的值,并且当遍历序 列时对遍历状态进行管理。在 IteratorProtocol 协议中唯一的一个方法是 next(),这个方法需 要在每次被调用时返回序列中的下一个值。当序列被耗尽时,next() 应该返回 nil:
我们一般不管心迭代器是如何工作的, 除非你自定义一个序列类型的时候需要。for 循环在背后: 编译器会自动为序列生成一个迭代器, 并且不断的调用 next 方法, 直到返回 nil。
1 |
var iterator = someSequence.makeIterator() while let element = iterator.next() {
|
迭代器是单向结构,它只能按照增加的方向前进,而不能倒退或者重置。虽然大部分的迭代器 的 next() 都只产生有限数量的元素,并最终会返回 nil,但是你也完全可以创建一个无限的,永 不枯竭的序列。实际上,除了那种一上来就返回 nil 的迭代器,最简单的情况应该是一个不断返 回同样值的迭代器了:
1 |
struct ConstantIterator: IteratorProtocol {
|
typealias 其实不需要写, 这里为了代码的可读性好, 就写出来了。 其实 next 的返回值可以推断出 Element 的类型为 Int。
注意这里 next() 被标记为了 mutating。对于我们这个简单的例子来说,我们的迭代器不包含任 何可变状态,所以它并不是必须的。不过在实践中,迭代器的本质是存在状态的。几乎所有有 意义的迭代器都会要求可变状态,这样它们才能够管理在序列中的当前位置。
我们来看一个更有意义的例子。FibsIterator 迭代器可以产生一个斐波那契序列。它将记录接
下来的两个数字,并作为状态存储,next 函数做的事情是为接下来的调用更新这个状态,并且 返回第一个数。和之前的例子一样,这个迭代器也将产生 “无穷” 的数字,它将持续累加数字, 直到程序因为所得到的数字发生类型溢出而崩溃 (我们暂时先不考虑这个问题):
遵守序列协议
我们也可以创造有限序列的迭代器,比如下面这个 Pre
Swift 进阶 第 4 课 集合类型协议的更多相关文章
- Swift 里集合类型协议的关系
  Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议,可以通过迭代来获取它的元素 ...
- [Swift通天遁地]五、高级扩展-(2)扩展集合类型
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Welcome-to-Swift-04集合类型(Collection Types)
Swift提供了两种集合类型来存放多个值——数组(Array)和字典(Dictionary).数组把相同类型的值存放在一个有序链表里.字典把相同类型的值存放在一个无序集合里,这些值可以通过唯一标识符( ...
- swift 集合类型(二)
说到swift的集合类型,就不得不谈到Dictionary.包含一个键值对组合的集合. var air = ["name":"warner","tit ...
- Swift中的集合类型
一.引子: 在2014年10月TIOBE编程语言排行榜中,Swift位居第18位,从2014WWDC发布会首次公布至今不到半年时间,swift一直受到编程人 员的追捧,其热衷程度并不亚于当红巨星Tay ...
- Swift学习笔记(5):集合类型
目录: 数组:Array 集合:Set 字典:Dictionary Swift提供Array(有序集合数据).Set(无序无重复集合)和Dictionary(无序键值对集合)三种基本集合类型来存储明确 ...
- 浅谈Swift集合类型
Swift 的集合表现形式由数组和字典组成.它可以完美的存储任何呢想存储的东西. 数组是一个同类型的序列化列表集合,它用来存储相同类型的不同值.字典也是一个数组,但它的存值方式类似于Map,通过一对一 ...
- 【Swift学习】Swift编程之旅---集合类型之数组(六)
swift提供了3种主要的集合类型,array,set,dictionary.本节介绍array. 数组是存储有序的相同类型的集合,相同的值可以多次出现在不同的位置. 注意: swift的Array类 ...
- Swift 集合类型
Swift语言提供数组和字典的集合类型 Swift 语言里的数组和字典中存储的数据值类型必须明确 ,即数组中只能存放同类型的数据. 1: 数组 数组的创建 var shoppingList: St ...
随机推荐
- Python笔记_第三篇_面向对象_2.第一个Python类
1. 设计一个类: 设计一个类主要从三个方面进行考虑: 第一:类名:类名要见名知意.首字母大写. 第二:属性. 第三:方法. 备注:在Python中有些东西并不是绝对化的事情,有些根据Python社区 ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- RL78 定义常量变量在指定的地址方法
若想定义的常量地址在远端寻址,定义section段时 如定义MCU_INFOR段 则段名为MCU_INFOR_f 后缀需要添加f,近端寻址添加n. 程序中定义常量 需要使用#pragma 指 ...
- 17.3.20---python的变量作用域
1---变量的作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.Python的作用域是静态的,在源代码中变量名被赋值的位置决 ...
- nodepad++ 让所有的加号收缩折叠展开的快捷键
折叠所有层次 Alt+0(这是零) 展开所有层次 Alt+Shift+0
- [JSOI2019]神经网络(树形DP+容斥+生成函数)
首先可以把题目转化一下:把树拆成若干条链,每条链的颜色为其所在的树的颜色,然后排放所有的链成环,求使得相邻位置颜色不同的排列方案数. 然后本题分为两个部分:将一棵树分为1~n条不相交的链的方案数:将这 ...
- 吴裕雄--天生自然python机器学习:KNN-近邻算法在手写识别系统上的应用
需要识别的数字已经使用图形处理软件,处理成具有相同的色 彩和大小® : 宽髙是32像 素 *32像素的黑白图像.尽管采用文本格式存储图像不能有效地利用内 存空间,但是为了方便理解,我们还是将图像转换为 ...
- LeetCode No.139,140,141
No.139 WordBreak 单词拆分 题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可 ...
- Yahoo!团队:网站性能优化的35条黄金守则
Yahoo!的 Exceptional Performance团队为改善 Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心 ...
- 解决2013Lost connection to MySQL server during query错误方法
在my.ini配置文件 mysqld 节点下添加 max_allowed_packet = 500M 也就是配置MySQL允许的最大数据包大小,上面的500M你可以根据你的项目修改为你自己的值,只要比 ...