本文介绍了如何使用带有类型别名的协议作为 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 参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 09:20