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