我正在尝试编写自己的IndexingIterator版本,以增强对Sequence的理解。我尚未在结构中将任何类型分配给关联类型迭代器。但是,编译器没有对此提示,并且我得到了makeIterator的默认实现。

以下是我的代码:

struct __IndexingIterator<Elements: IndexableBase>: Sequence, IteratorProtocol {
    mutating func next() -> Elements._Element? {
        return nil
    }
}
let iterator = __IndexingIterator<[String]>()
// this works and returns an instance of __IndexingIterator<Array<String>>. why?
iterator.makeIterator()

我认为Sequence上必须有一些扩展,这些扩展添加了默认实现。因此,我在Sequence.swift中搜索了它,但仅找到了它。
extension Sequence where Self.Iterator == Self, Self : IteratorProtocol {
  /// Returns an iterator over the elements of this sequence.
  public func makeIterator() -> Self {
    return self
  }
}

我以为会是这样的:
extension Sequence where Self: IteratorProtocol {
    typealias Iterator = Self
    ...
}

我错过了什么吗?还是我误解了扩展名?

最佳答案

看来亚历山大的答案是正确的。这是一个简化的版本,没有使用Sequence:

protocol MySequence {
    associatedtype Iterator: IteratorProtocol
    func maakeIterator() -> Iterator
}

extension MySequence where Self.Iterator == Self, Self : IteratorProtocol {
    /// Returns an iterator over the elements of this sequence.
    func maakeIterator() -> Self {
        return self
    }
}

struct __IndexingIterator<Element>: MySequence, IteratorProtocol {
    mutating func next() -> Element? {
        return nil
    }
}

let iterator = __IndexingIterator<[String]>()
iterator.maakeIterator()

关于swift - 符合Swift中的Sequence和IteratorProtocol,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40669539/

10-12 14:30