斯威夫特协议如何才能符合类型参数协议
我有以下相当简单雨燕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
内部调用约束,这样也不会帮助我。
那么......这个问题在错误信息中说得很清楚! 要点是你声明了一个使用泛型的函数,泛型对协议有一个约束。然后使用泛型U ...写入方法test(),这意味着当您真正使用该方法时,编译器必须清楚符合要实例化并由test()返回的协议PA的实际类型是什么。 在函数foo中,这个不清楚......当它从未被提及时,你怎么能期望测试返回CB?尝试:
X().test<CB>()
错误... return X()。test
你不能明确地专门化Swift中的通用函数 –
我的不好...抱歉! – Freedom
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()
}
}
这是'正常'。测试() - > U是带有返回U类型实例的U类型参数的函数.foo返回类型是PA.Type,不是符合PA的类型,如U:PA。换句话说,从protocol.Type创建一个实例是不可能的。尝试让a = Any()。它也不可用。 –
user3441734