[swift 进阶]读书笔记-集合类型协议 C3P1_序列

集合类型协议


3.1序列: sequence

知识点1:满足sequence协议只需提供一个返回迭代器(iterator):的makeIterator方法。 集合<-Sequence<-Iterator

迭代器:Iterator


里面只有一个方法next( )

public protocol IteratorProtocol {
    ///关联类型 Element 指定了迭代器产生的值的类型 
    ///如 subViews的迭代原生类型就是View 可以不用写,编译器根据next()的返回值自动判断。
    associatedtype Element
    
    ///你只需要在每次调用的时候返回下一个值,结束时返回nil
    public mutating func next() -> Self.Element?
}

next( )方法是用 mutating 关键字修饰。 几乎所有的迭代器都要求是可变状态,这样才可以管理在序列中的当前位置----(这句话的意思到现在还没太理解。大家可以把自己的理解写上了,thanks~)

下面我们用迭代器写一个斐波那契数列(0,1,1,2,3,5,8,13.....)。

struct FibsNumIterator:IteratorProtocol {
    var startNum = (0, 1)
    mutating func next() -> Int? {
        let nextNum = startNum.0
        startNum = (startNum.1, startNum.0 + startNum.1)
        return nextNum
    }
}

这个迭代器不返回nil, 就会产生无穷的数组。 程序会因为类型溢出而crash。

注:迭代器是单向结构,只能按照增加的方向前进,不能倒退或者重置。

准守序列(sequence)协议


下面我们通过一个打印一个字符串所有前缀的demo 通过自定义迭代器自定义集合去写一个属于你的集合~

第一步: 创建一个迭代器(Iterator)

struct PrefixStrIterator:IteratorProtocol {
    var string: String
    var offset: String.Index
    init(string:String) {
        self.string = string
        offset = string.startIndex
    }
    ///写协议方法
    mutating func next() -> String? {
        guard offset < string.endIndex else { return nil}
        offset = string.index(after: offset)
        return String(string[string.startIndex..<offset])
    }
}

第二步: 创建一个使用这个迭代器的序列(sequence)

///step2.创建一个属于你的集合
struct PrefixSequence: Sequence {
    var string: String
    
    ///协议方法:返回一个迭代器
    func makeIterator() -> PrefixStrIterator {
        return PrefixStrIterator(string: string)
    }
}

第三步: run~

        ///myfirstSquence 我的第一个集合
        for prefixStr in PrefixSequence(string: "Hi~LiaoWorking!") {
            print(prefixStr)
//            H
//            Hi
//            Hi~
//            Hi~L
//            Hi~Li
//            Hi~Lia
//            Hi~Liao
//            Hi~LiaoW
//            Hi~LiaoWo
//            Hi~LiaoWor
//            Hi~LiaoWork
//            Hi~LiaoWorki
//            Hi~LiaoWorkin
//            Hi~LiaoWorking
//            Hi~LiaoWorking!
        }

迭代器和值语义


先说说值语义和引用语义,这两个定义无论在今后的学习还是日常开发细节中会经常遇到~ 敲黑板!

作用对象 特性
值语义 struct,应该还有其他类型。待补充。 赋值时不存在引用,复制了一份过去了
引用语义 class 赋值时存在引用

注:但AnyIterator这个是引用对象。。(协议章中的类型抹消的内容我们再具体说~)

基于函数的迭代器和序列


继续写一个Demo: AnyIterator还有一个初始化方法就是直接接受next()函数来当做参数。然后通过引用语义的特性,我们可以不创建新的类型就写一个斐波那契迭代器

/// 通过引用语义的特性写斐波那契
func fibsIterator() -> AnyIterator<Any> {
    var startNum = (0, 1)
    return AnyIterator{
        let nextNum = startNum.0
            startNum = (startNum.1 , startNum.0 + startNum.1)
        return nextNum
    }
}

这个是高阶知识点,的确没有第二章的生动。了解一下也挺好啊~~

无限序列


序列可以是无限的,而集合是有限的。

不稳定序列


Sequence文档明确指出序列并不保证能被多次遍历。
原因是Sequence协议并不关心里面的序列元素会不会销毁。

知识点1:这就是为什么在集合类型中.first 在序列中并不存在。

序列sequence和迭代器Iterator的关系

迭代器Iterator可以看成即将返回的元素组成的不稳定序列sequence

子序列


Sequence还有一个关联类型 SubSequence

在返回原序列Sequence的切片slice操作中,SubSequence会被当做返回值的子类。

SubSequence 有一些常用方法

prefix 
suffix
dropFirst
dropLast
split

在项目中其实经常会遇到SubSequence,如string的SubSequence等等。。(哈哈才一个,这个不能叫“经常”。其实是会经常遇到SubSequence。不过一时之间想不起来了😅)

文章源文件地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,836评论 6 13
  • 前言 写这篇文章主要是为了给组内要做的分享准备内容。这段时间几个项目都用到 Swift,在上次 GIAC 大会上就...
    星光社的戴铭阅读 2,697评论 6 43
  • 最近发现自己总是挤不出墨汁出来,想写点什么,欲言又止,写个一句半句又删除了。甚至不知道这究竟出于何种原因。 也许阅...
    林子源阅读 237评论 3 53
  • @keyframes 规定动画。 3 animation 所有动画属性的简写属性,除了 animation-pla...
    gtt21阅读 850评论 0 0
  • 唯有学习不会停止。早安,世界。早安,未来。早安,爱学习的你。
    oulan阅读 52评论 0 0