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