第三篇:AnyIterator , AnySequence ,IteratorOverOne的补充解释

AnyIterator

MyIterator 等价于 AnyIterator,实质是传入一个生成下一个元素的闭包

struct MyIterator<Element>:IteratorProtocol {
    var base:()->Element?
    init(_ body: @escaping () -> Element?) {
        base = body
    }
    
    func next() -> Element? {
        return base()
    }
}

var x = 7
let iterator:MyIterator<Int> = MyIterator {
    defer { x += 1 }
    return x < 15 ? x : nil
}

iterator.next()

这里 x 被关联至闭包中,充当了数据源的作用,而闭包的作用是操作数据源,这里是生成下一个元素。

接着我们让 MyIterator 遵循 Sequence 协议,但不用实现任何方法。

extension MyIterator:Sequence {}

var x = 7
let iterator:MyIterator<Int> = MyIterator {
    defer { x += 1 }
    return x < 15 ? x : nil
}

iterator.next() // 输出7

for y in iterator {
    print(y) // 输出 8 9 10 11 12 13 14
}

注意 for-in 只要是遵循了 Sequence,就可以这么用了。本质是调用了 next() 方法。 ps: 注意没有7哦!

看下苹果接口的注释:

/// Every IteratorProtocol can also be a Sequence. Note that
/// traversing the sequence consumes the iterator.
extension AnyIterator : Sequence {
}

这么理解:我们的迭代器调用 next() 方法可以一个接一个的生成元素,不就是个序列吗?但是!这是个一次性消耗品,遍历一次就消耗殆尽。倘若不信,不妨在前面的代码之后再调用一次for y in iterator { print(y) },啥都没有吧。

这里有个疑惑:为什么遵循Sequence,啥都不用实现呢? 有待考证!

/// To add `Sequence` conformance to your own custom type, add a
/// `makeIterator()` method that returns an iterator.

/// 重点看这里
/// Alternatively, if your type can act as its own iterator, implementing the
/// requirements of the `IteratorProtocol` protocol and declaring conformance
/// to both `Sequence` and `IteratorProtocol` are sufficient.

那底层又是怎么实现的呢?从定义出发

protocol SequenceType {
    associatedtype Iterator : IteratorProtocol
    func makeIterator() -> Self.Iterator
}

extension SequenceType {
    func makeIterator() -> Self.Iterator {
        return self as! Self.Iterator
    }
}

是不是extension 默认把自己当做 Iterator 返回呢?

AnySequence

Sequence 其实是要关联一个数据源,姑且称之为 content;然后关联一个生成器iterator,将 content 中的元素一个个取出。

主要是看 AnySequence 的构造方法

public struct AnySequence<Element> : Sequence {

    public init<S : Sequence where S.Iterator.Element == Element, S.SubSequence : Sequence, S.SubSequence.Iterator.Element == Element, S.SubSequence.SubSequence == S.SubSequence>(_ base: S)

    public init<I : IteratorProtocol where I.Element == Element>(_ makeUnderlyingIterator: @escaping () -> I)
  
    ...    
}

暂时没有想到底层如何实现,有待考证。

IteratorOverOne

这里很好理解,首先初始化一个迭代器,然后用这个迭代器生成一个序列。

func one<A>(x: A) -> AnySequence<A> {
    return AnySequence(IteratorOverOne(x))
}

我将定期更新有关此分类的学习笔记。
请关注我的微博:Ninth_Day

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,406评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,048评论 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,656评论 1 10
  • begin with one quickSort 之前在学习时曾看到swift如此简洁地表达出了快排算法。 时虽叹...
    KisugiRui阅读 1,507评论 0 2
  • 上午看到有朋友在微社吆喝,发上照片,请求大家帮她挑选眼镜。看到这些,第一反应是,自己的审美眼光不行,比较僵化保守,...
    绽蕊向阳阅读 174评论 0 0