Ios 类型字典迭代器不符合协议';序列';从容器类返回DictionaryInterator时

Ios 类型字典迭代器不符合协议';序列';从容器类返回DictionaryInterator时,ios,swift,macos,dictionary,iterator,Ios,Swift,Macos,Dictionary,Iterator,此代码让Swift编译器使用返回的字典迭代器抱怨第二次迭代: import Foundation class Container { private var mArray: [String] = ["One", "Two", "Three"] private var mDict: [Int:String] = [0: "value1", 1: "value2", 2: "value3"] func getArrayIterator() -> IndexingIt

此代码让Swift编译器使用返回的
字典迭代器抱怨第二次迭代:

import Foundation

class Container
{
    private var mArray: [String] = ["One", "Two", "Three"]
    private var mDict: [Int:String] = [0: "value1", 1: "value2", 2: "value3"]

    func getArrayIterator() -> IndexingIterator<[String]>
    {
        return mArray.makeIterator()
    }

    func getDictIterator() -> DictionaryIterator<Int, String>
    {
        return mDict.makeIterator()
    }
}

let container = Container()

for value in container.getArrayIterator()
{
    print("Value: \(value)")
}

for (key, value) in container.getDictIterator() // Type 'DictionaryIterator<Int, String>' (aka 'Dictionary<Int, String>.Iterator') does not conform to protocol 'Sequence'
{
    print("Key: \(key), value: \(value)")
}
<代码>导入基础 类容器 { private var mArray:[字符串]=[“一”、“二”、“三”] 私有变量mdct:[Int:String]=[0:“value1”、1:“value2”、2:“value3”] func getArrayIterator()->索引迭代器 { 返回mArray.makeIterator() } func GetDictionator()->DictionaryIterator { 返回mdct.makeIterator() } } let container=container() 对于container.getArrayInterator()中的值 { 打印(“值:\(值)”) } 对于容器中的(键、值)。GetDictionator()//类型“DictionaryIterator”(又名“Dictionary.Iterator”)不符合协议“Sequence” { 打印(“键:\(键),值:\(值)”) }
然而,查看文档中的
字典.迭代器
似乎它实际上符合协议顺序。
编辑: 实际上,它说,
Dictionary.Iterator
与“来自协议”
Sequence


为什么这段代码不起作用?

一般来说,迭代器不是您可以在中为…说的东西;这就是为什么你可以在中对其他东西说“
for…”的原因。在引擎盖下,
for…in
实际上是一个
while
循环,它在迭代器上重复调用
next
。现在你已经看了窗帘后面,这也是你必须使用的

比如说,我们有一本字典

let d = [1:"hey", 2:"ho"]
那么这个,

for (i,s) in d {
    print(i, s)
}
与此等效:

var it = d.makeIterator()
while let (i,s) = it.next() {
    print(i,s)
}
事实上,在幕后,前者是后者。在某些情况下,如果将
中的…展开到迭代器表单中,使循环按您想要的方式运行会更容易

现在,在一个数组的特殊情况下,它由数字索引,迭代器是一个索引迭代器,它本身有一个迭代器,它本身有一个迭代器,依此类推。一路上都是乌龟,令人作呕:

let arr = [1,2,3]
let whoa = arr.makeIterator().makeIterator().makeIterator() // !!!!
for i in whoa {
    print(i)
}

只要你愿意,你就可以继续使用这个定义。

注意,文档中说它与序列有关系,而不是说它符合序列。老实说,我不太清楚这意味着什么,从一个关系,但它似乎是不同于遵守一个协议好点!有趣的是,通过查看Xcode中的嵌入式文档,我看到了字典。迭代器符合迭代器协议。看着这些文档,我似乎应该能够在上面使用for-in构造。同样有趣的是,嵌入式Xcode文档与在线文档不同。我认为您对迭代器有误解。整个要点是,虽然它是你循环通过某个东西的能力的基础,但它本身是不可循环的,除非通过反复调用
next
。要使迭代器可以循环,它本身就需要一个迭代器,如此类推,宇宙就会爆炸。所以,在下一步时使用
(这是伪代码,但你明白我的意思)像其他人一样,保持宇宙安全!谢谢,解释得很好。为什么数组迭代器实际上符合序列(并因此工作)?它是否使用
makeIterator()
返回自身的副本?接下来的代码行在功能上是否相同
var it=container.getDictionator();而let(key,value)=it.next()
用于容器中的in(key,value)。getDictionator()
排序。我已经在我的答案中添加了一个代码等价的例子。你能把你关于世界爆炸的评论合并到这个答案中吗?这对理解你的意思很有帮助。关于迭代器返回迭代器(通过makeIterator())的一点让它点击了。宇宙还没有爆炸,但你永远也不知道。