swift enum创建链表(二)

上一篇中我们简单实现了list的push,pop基本功能。
下面我们再来添砖加瓦。

实现SequenceType协议

之前我们是实现了description方法,实现list的打印遍历。
😄感觉那个方法有点老套,现在拿点新东西来玩。generator。生成迭代器来进行遍历。

sequenceType的generate的定义是:

typealias Generator : GeneratorType
public func generate() -> Self.Generator

GeneratorType是个protocol,generate返回实现了该协议的对象。

list实现sequenceType如下:

extension List: SequenceType {
    func generate() -> AnyGenerator<Element> {
        var current = self
        return anyGenerator({
            current.pop()
        })
    }
}

当current.pop()返回nil的时候,遍历就结束了。

查看AnyGenerator定义,发现它是实现了GeneratorType的。

public class AnyGenerator<Element> : GeneratorType

这样就可以方便的进行遍历了。

var l2 = List<Int>.Empty.insert(2).insert(3)
for x in l2 {
    print(x)
}

实现ArrayLiteralConvertible协议

实现该协议后,可以直接从array生成list,是不是很方便呢。

extension List: ArrayLiteralConvertible {
    init(arrayLiteral elements: Element...) {
        self = elements.reverse().reduce(List.Empty, combine: {
            $0.insert($1)
        })
    }
}

用法

let l1: List = [1, 2, 3]
for x in l1 {
    print(x)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,957评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,681评论 4 61
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,399评论 19 139
  • 生日默默地过了, 时间默默地少了, 日子默默的淡了, 心思默默地多了。 人儿, 默默的忘了。
    大显阅读 181评论 0 1
  • 为何不做个24k纯金老男人, 买个50平左右的小房子,好好按自己的心情装修? 享受生活,朋友聚会,毛绒绒的地毯,灯...
    17d29357f903阅读 202评论 0 0

友情链接更多精彩内容