我正在尝试编写自己的IndexingIterator版本以增加对Sequence的理解.我没有在我的struct中为associatetype Iterator指定任何类型.然而,编译器没有抱怨,我得到了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 ... }
我错过了什么或者我误解了扩展吗?
看起来亚历山大的答案是正确的.这是一个简化版本,不使用序列: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()