2015-11-05 92 views
0

我有以下相当简单雨燕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: error: generic parameter 'U' could not be inferred return X().test()

我想ü推断为PA类型

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

类似地从U删除PA约束:PA和编译器推断它在foo内部为PA类型,但是我需要在test内部调用约束,这样也不会帮助我。

+0

这是'正常'。测试() - > U是带有返回U类型实例的U类型参数的函数.foo返回类型是PA.Type,不是符合PA的类型,如U:PA。换句话说,从protocol.Type创建一个实例是不可能的。尝试让a = Any()。它也不可用。 – user3441734

回答

0

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

X().test<CB>() 
+0

错误... return X()。test ()should not works。你不能明确地专门化一个通用函数 – user3441734

+0

你不能明确地专门化Swift中的通用函数 –

+0

我的不好...抱歉! – Freedom

0
class ThisFails { 
    func foo() -> PA { 
     return X().test() // error: generic parameter 'U' could not be inferred 
    } 
} 

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

检查下一行

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() 
    } 
} 
相关问题