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 ...
随机推荐
- 40)类与类之间的关系(has use is)
1)类与类之间的关系 一般就是三类: ①has--A ②use--A ③is-----A ①has--A 包含关系,用以描述一个类由多个“部件构成”.实现has--A关系用类成员表示, 即一个类 ...
- day52-线程-队列
#1.线程的队列是使用import queue,如果使用from threading import Queue会报错,因为threading模块没有Queue. #也就是说,线程队列Queue是在qu ...
- Office、VBA开发方案选择指南
最近很多朋友向我提出Office的开发方式方面的疑惑,主要是针对特定的系统和Office版本不知道选择哪一种编程语言.创建哪一种类型的项目. 事实确实如此,如果搞不清楚语言的特性和项目类型的特点,很可 ...
- Perl语言入门:第九章 使用正则表达式处理文本 示例程序和代码
#! /usr/bin/perl use strict; use warnings; print "\n----------------------------------_substitu ...
- diary-2019.9.16
It has been observed by various scientists and nutritionists that it is better to have smaller and a ...
- 不同SQL数据库之间表数据的实时同步-发布与订阅
https://blog.csdn.net/rand_muse/article/details/81326879 上述文章中,如果是实时同步,选择 事务发布即可 在快照代理 那里,不需要勾选 运行 ...
- 浅谈PHP小马免杀
在渗透测试过程初期,上传小马,拿到 webshell 再进行下一步的操作,现如今的网站安全更多是 一些云防护.CDN防护.服务器安全软件等等,给渗透测试.提权等带来了一定难度的提升, 今天探讨一下如何 ...
- jquery JavaScript如何监听button事件
下面的html页面中有两个按钮 <div class="layui-tab-item layui-show"> <form class="layui-f ...
- Python的range(n)的用法
Python的range(n) 方法就是: API定义: If you do need to iterate(迭代) over a sequence(一系列) of numbers, the buil ...
- Hadoop_在linux中安装hadopp出现的问题
问题 sudo: no valid sudoers sources found, quitting 网络解决方法 链接:sudo: no valid sudoers sources found, qu ...