我有非常直接的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
内调用约束,这样对我来说也无法帮助。
答案 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}}