足够简单的示例:
protocol Fulfilment {
}
class Node<T: Fulfilment> {
var object: T
var children: [Node]
init(object: T, children: [Node] = []) {
self.object = object
self.children = children
}
}
struct One: Fulfilment {
}
struct Two: Fulfilment {
}
let node1 = Node<One>(object: One())
let node2 = Node<Two>(object: Two(), children: [node1])
我在最后一行遇到错误,因为node1
的类型不是Two
,即使我没有指定应将通用类型应用于children
。编译器将代码当作我写过
var children: [Node<T>]
我想遵循相同的泛型类型的假设使我头疼。我能以某种方式告诉Swift我不想要这种行为吗?
答案 0 :(得分:2)
问题在于,没有特定的通用类型参数就没有这样的类型Node
,而Node
和Node<One>
这样的专门版本的Node<Two>
是完全不相关的类型,因此您始终无法存储具有不同Node
类型的object
数组。因此,编译器推断children
的类型为Node<T>
。