我一直在尝试扩展一个包含特定类型的 swift 数组。
protocol Node {
var nodeId: Int { get }
var parentId: Int? { get }
var children: [Node] { get set }
var level: Int { get set }
}
extension Array where Element : Node {
/**
unflatten an array of Nodes.
*/
func unflattenNodes()-> [Node] {
func unflatten(inout parent: Node?)-> [Node] {
var topNodes = [Node]()
let children = self.filter{ (child: Node) in return child.parentId == parent?.nodeId ?? 0 }
if !children.isEmpty {
if var parent = parent {
for var child in children {
child.level = parent.level + 1
}
parent.children = children
}
else {
topNodes = children
}
for child in children {
var optChild = Optional(child)
unflatten(&optChild)
}
}
return topNodes;
}
var optChild: Node? = nil
return unflatten(&optChild)
}
}
上面的代码不会被编译,因为“节点”不是“元素”的子类型,即使我正在扩展元素“节点”的数组。 我怎样才能 swift 存档我想在这里做的事情? 我正在尝试向 [Node] 添加实例方法以展开 self 。
最佳答案
问题是协议(protocol) Node
不符合自身:Node
不是 Node
类型(听起来很矛盾),因为协议(protocol)不是具体类型,它只是对符合类型的要求。
也就是说,您需要将代码中的每个 Node
实例替换为 Element
,然后它应该可以工作(现在无法测试)。这是因为,您实际上不是在处理某些 Node
类型的值,而是处理符合 Node
(Element
> 在你的情况下)
此外,您在代码中还犯了其他一些错误,我会把它留给其他人来更正,因为我没时间了。
关于ios - 扩展保存特定元素类型的快速数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957244/