为什么Swift中的类型推断不处理传递约束?

时间:2017-01-11 17:03:20

标签: swift generics type-inference type-parameter

this question进行修补,我提出了这个问题:

class AllTogether<T: FooProtocol> {
    func createContainer<U: T>(data: U){
        Container<T>(someDataConformingFooProtocol: data)
    }
}

我的理解是,如果我们使FooProtocol成为一个类协议,这应该有效:

protocol FooProtocol: class { ... }

但是,我们仍然会遇到错误:

Error: inheritance from non-protocol, non-class type 'T'
Error: argument type 'U' does not conform to expected type 'FooProtocol'

这两条消息似乎都是错误的。我错过了什么?

子类型关系在Swift中不可传递吗?

1 个答案:

答案 0 :(得分:0)

该函数添加了一个不必要的附加关系。

Container希望使用类型为T的对象进行初始化。

如果U是T的子类,那么任何可以用

调用的东西
func createContainer<U: T>(data: U)

也可以用

调用
func createContainer(data: T)

基本上,函数正在做什么似乎应该是可能的(并且可能在某些时候.Swift的泛型是由于要进行彻底改进/改进)但无论如何它都是毫无意义的。

请改用:

func createContainer(data: T){
    Container<T>(someDataConformingFooProtocol: data)
}