Swift协议如何符合类型参数协议

时间:2015-11-05 11:24:12

标签: swift generics

我有非常直接的Swift 2.0代码

protocol PA {
    init(handle:Int)
}

class CB: PA {
    required init(handle:Int) {}
}

class X {
    func test<U:PA>() -> U {
        return U(handle: 1)
    }
}

class ThisFails {
    func foo() -> PA {
        return X().test()
    }
}

但它无法使用相当奇怪的错误消息进行编译

  

swift:23:20:错误:无法推断通用参数“U”           返回X()。test()

我希望U被推断为PA类型

将方法foo的返回类型更改为CB使其工作,但我有许多实现PA协议的类,因此对我不起作用。

同样从U中删除PA约束:PA和编译器在foo内将其推断为PA类型,但我需要在test内调用约束,这样对我来说也无法帮助。

2 个答案:

答案 0 :(得分:0)

嗯......错误信息中说明的问题非常明确! 要点是您使用泛型声明了一个函数,泛型类型对协议有约束。然后使用泛型U ...编写方法test(),这意味着当您实际使用该方法时,必须清楚编译器符合要实例化并由test()返回的协议PA的实际类型是什么。 在函数foo中,这一点并不清楚......如果从未提及测试返回CB,你怎么能期望测试?尝试:

X().test<CB>()

答案 1 :(得分:0)

X().test()       // error: generic parameter 'U' could not be inferred
X().test() as CB // no error

检查下一行

tryclass ThisFails {
    func foo<U:PA>() -> U {
        return X().test()
    }
}

问题是如何制作未知类型的实例。编程器知道的是,类型应该符合协议。它是不是应该的,不是吗?

{{1}}