IteratorProtocol需要next()函数用于通用链表

时间:2018-01-03 18:13:31

标签: swift linked-list

我正试图通过99 Swift Problems并且我很早就陷入问题4.我有一个链表,我试图找到它的长度。

我计划迭代列表中的元素来计算它们。但我不能使用for / in循环迭代而不使其符合Sequence和IteratorProtocol。我陷入了必需的next()函数。我不确定如何在这种情况下实现下一个功能,我希望有一些方向。

以下是我的链接列表:



public class List<T>: Sequence, IteratorProtocol {
    public typealias Element = T
    
    var value: T!
    var nextItem: List<T>?
    
    public convenience init!(_ values: T...) {
        self.init(Array(values))
    }
    
    init!(_ values: Array<T>) {
        var values2 = values
        if values2.count == 0 {
            return nil
        }
        value = values2.removeFirst()
        nextItem = List(values2)
    }
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

您不想实施IteratorProtocolnext。您只想实施Sequence以使用for/in。为此类型实施Sequence的最佳方法是实施makeIterator

extension List: Sequence {
    public func makeIterator() -> AnyIterator<T> {
        var current: List<T>? = self
        return AnyIterator {
            let result = current?.value
            current = current?.nextItem
            return result
        }
    }
}

let list = List(1,2,3)!
for x in list { print(x) }  // 1 2 3