我正在尝试使用Swift协议作为类型。我有以下代码:
protocol STCMultipeerProtocol {
typealias ErrorBlock = (NSError?)->();
func start();
func stop();
func retryConnecting();
func disconnect();
}
class STCConnectivityManager: NSObject {
typealias VoidBlock = ()->();
private var roleManager: STCMultipeerProtocol?
private var completionBlock: VoidBlock?
....
}
现在,问题是编译器给了我错误:
Protocol 'STCMultipeerProtocol' can only be used as a generic constraint because it has Self or associated type requirements.
我看到很多其他人看到了这个错误,但我无法理解这个问题的正当原因和解决方案。
如果有人能帮我解决这个问题,我真的很感激
答案 0 :(得分:5)
在协议中使用typealias
时,它被称为协议关联类型声明,并且与符合协议的"最终类型相关联&# 34;又名Self
。您可以在核心Swift库中看到这些内容,例如序列或基本类型。编译器需要Self信息才能完成工作,因此失败了。
好处是您不需要协议中的类型,并可以将其作为命名空间内的全局定义移出:
typealias ErrorBlock = (NSError?)->();
protocol STCMultipeerProtocol {
func start();
func stop();
func retryConnecting();
func disconnect();
}
如果您有很多错误类型,可以将其称为MultipeerErrorBlock
。