符合Swift中的Sequence和IteratorProtocol

符合Swift中的Sequence和IteratorProtocol,第1张

概述我正在尝试编写自己的IndexingIterator版本以增加对Sequence的理解.我没有在我的struct中为associatetype Iterator指定任何类型.然而,编译器没有抱怨,我得到了makeIterator的默认实现. 以下是我的代码: struct __IndexingIterator<Elements: IndexableBase>: Sequence, Iterator 我正在尝试编写自己的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()
总结

以上是内存溢出为你收集整理的符合Swift中的Sequence和IteratorProtocol全部内容,希望文章能够帮你解决符合Swift中的Sequence和IteratorProtocol所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存