本文介绍了如何使用带有类型别名的协议作为 func 参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下代码:
protocol ProtocolA {
}
protocol ProtocolB {
typealias T: ProtocolA
var value : Array<T> { get set }
}
class ProtocolC {
func method<T: ProtocolA>(value: ProtocolB<T>)
{
}
}
产生以下错误:
error: cannot specialize non-generic type 'ProtocolB'
func method<T: ProtocolA>(value: ProtocolB<T>)
error: generic parameter 'T' is not used in function signature
func method<T: ProtocolA>(value: ProtocolB<T>)
error: protocol 'ProtocolB' can only be used as a generic constraint because it has Self or associated type requirements
func method<T: ProtocolA>(value: ProtocolB<T>)
谁能解释一下为什么这是不可能的?这是错误还是故意的?
Can anyone explain me why this is not possible? Is this a bug or intentional?
推荐答案
你不能用 <>
专门化通用 protocol.
You cannot specialize generic protocol with <>
.
相反,您可以:
func method<B: ProtocolB where B.T: ProtocolA>(value: B) {
}
也就是说,method
接受 B
,其中 B
符合 ProtocolB
和 它的 T
符合 ProtocolA
.
That says, method
accepts B
where B
conforms ProtocolB
and its T
conforms ProtocolA
.
而且,在这种情况下,您不需要 where B.T: ProtocolA
因为它很明显.
And, in this case, you don't need where B.T: ProtocolA
because it's obvious.
func method<B: ProtocolB>(value: B) {
...
}
这篇关于如何使用带有类型别名的协议作为 func 参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!