我正在尝试编写自己的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()