【问题标题】:IteratorProtocol needing next() function for generic linked listIteratorProtocol 需要用于通用链表的 next() 函数
【发布时间】:2018-01-03 18:13:30
【问题描述】:

我正在尝试通过99 Swift Problems 并且我很早就在问题 4 上卡住了。我有一个链接列表,我试图找到它的长度。

我正计划遍历列表中的元素来计算它们。但是如果不符合 Sequence 和 IteratorProtocol,我就无法使用 for/in 循环进行迭代。我被困在所需的 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)
    }
}

【问题讨论】:

    标签: swift linked-list


    【解决方案1】:

    您不想实现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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2017-03-31
      • 2023-03-05
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多