Swift 3收集子类赢得';不编译

Swift 3收集子类赢得';不编译,swift,collections,Swift,Collections,我在Swift中有一个节点类,它实现了集合,因此每个节点递归地充当相同类型的子节点集合 问题是,当我创建子类节点时,我仍然希望该子类充当节点的集合,但当我尝试迭代子类派生节点的实例时,Swift甚至不会编译,抱怨: IndexingIterator不能转换为IndexingIterator 我不明白为什么它会这么做。我不关心迭代DerivedNodes,它们应该继续作为Nodes进行迭代 有趣的是,编译器/编辑器知道它们应该是Node类型,因为帮助弹出窗口显示了正确的类型。但由于某种原因,它仍然

我在Swift中有一个
节点
类,它实现了
集合
,因此每个
节点
递归地充当相同类型的子节点集合

问题是,当我创建子类
节点
时,我仍然希望该子类充当
节点
的集合,但当我尝试迭代子类
派生节点
的实例时,Swift甚至不会编译,抱怨:

IndexingIterator
不能转换为
IndexingIterator

我不明白为什么它会这么做。我不关心迭代
DerivedNode
s,它们应该继续作为
Node
s进行迭代

有趣的是,编译器/编辑器知道它们应该是
Node
类型,因为帮助弹出窗口显示了正确的类型。但由于某种原因,它仍然无法编译

下面是我如何实现
集合
协议的:

extension Node: Collection {
    public typealias Index = Int

    public var startIndex: Int {
        return 0
    }

    public var endIndex: Int {
        return attributes.count
    }

    public func index(after i: Int) -> Int {
        return i + 1
    }

    public subscript(i: Int) -> Node {
        return attributes[i].value
    }
}

如果未声明迭代器,则集合将为您提供一个迭代器:

public func makeIterator() -> IndexingIterator<Self>

这需要为
IndexingIterator
调用未记录的初始值设定项。在我看来,这是一个好消息。应该支持手动创建
索引迭代器。

您能展示一下您是如何遵守
集合的吗?您是否使用
节点
作为
元素
?我没有在任何地方明确声明
元素
。我应该这么做吗?我不能重新创建这样工作的节点。什么是
属性
?它似乎是
[Node]
,但
value
也是
Node
?它实际上是
[(名称:String,值:Node)]
,但字符串在这种情况下并不重要。啊,谢谢!我正在阅读的文档中没有提到这种方法。我猜从技术上讲,如果您不是子类化的话,就不需要它,但是可以说,当您是子类化的时候,默认行为没有多大意义。
public func makeIterator() -> IndexingIterator<Node> {
    return IndexingIterator(_elements: self)
}