如何使用带有typealias的协议作为func参数?

时间:2015-08-26 23:45:24

标签: swift swift2

以下代码:

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>)

任何人都可以解释为什么这是不可能的吗?这是一个错误还是故意的?

2 个答案:

答案 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)
    {

    }
}