以下代码:
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>)
任何人都可以解释为什么这是不可能的吗?这是一个错误还是故意的?
答案 0 :(得分:2)
您无法使用<>
专门化通用协议。
相反,你可以:
func method<B: ProtocolB where B.T: ProtocolA>(value: B) {
}
也就是说,method
接受B
B
符合ProtocolB
而 T
符合ProtocolA
。
而且,在这种情况下,您不需要where B.T: ProtocolA
,因为它很明显。
func method<B: ProtocolB>(value: B) {
...
}
答案 1 :(得分:1)
删除<T>
定义中B
参数后的method
。您也不需要方法签名中的<T: ProtocolA>
。
protocol ProtocolA {
}
typealias T = ProtocolA
protocol ProtocolB {
var value : [T] { get set }
}
class ProtocolC {
func method(value: ProtocolB)
{
}
}