【发布时间】:2015-11-05 22:07:00
【问题描述】:
我遵循了相当直接的 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 内进行 constrained 调用,这样也无济于事。
【问题讨论】:
-
这是“正常的”。 test
()->U 是函数,参数为 U 类型,返回 U 类型的实例。 foo 返回类型为 PA.Type,而不是符合 PA 的类型,如 U:PA。换句话说,从protocol.Type 创建一个实例是不可能的。尝试让 a = Any()。它也不可用。