Swift递归使用时假定通用类型

时间:2019-06-25 15:33:42

标签: swift generics

足够简单的示例:

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我不想要这种行为吗?

1 个答案:

答案 0 :(得分:2)

问题在于,没有特定的通用类型参数就没有这样的类型Node,而NodeNode<One>这样的专门版本的Node<Two>是完全不相关的类型,因此您始终无法存储具有不同Node类型的object数组。因此,编译器推断children的类型为Node<T>