summer的ios小记Swift开发技巧iOS学习笔记

swift enum创建链表(二)

2015-12-11  本文已影响102人  微微笑的蜗牛

上一篇中我们简单实现了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)
}
上一篇下一篇

猜你喜欢

热点阅读