【发布时间】:2015-03-14 18:16:33
【问题描述】:
假设我有以下代码:
protocol A {}
struct B: A {}
func b() -> A {
return B()
}
func f<T where T: A>(t: T) -> T {
return t
}
f(b())
这会导致以下错误(Xcode 6.3 beta 3):
Playground 执行失败:Test.playground:12:1: 错误:泛型参数“T”不能绑定到非@objc 协议类型“A”
f(b())
^
Test.playground:8:6: note: in call to function 'f'
func f<T where T: A>(t: T) -> T {
^
我觉得这是在 Swift 中实现泛型的一个缺点。有没有办法很好地解决这个问题,同时仍然保留泛型?
在我的代码f() 中有额外的类型要求;我可以完全忘记协议和泛型,但我不接受那么容易的失败;-)。
【问题讨论】:
-
取决于您的用例,但如果可能的话,我会尝试通过将
b()定义为泛型来避免类型擦除B并返回实际类型... -
但是如果我需要
b需要通用呢?