Swift协议作为一种类型

Vik*_*ngh 1 ios swift ios8

我试图使用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?
 ....
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是编译器给我错误:

Protocol 'STCMultipeerProtocol' can only be used as a generic constraint because it has Self or associated type requirements.
Run Code Online (Sandbox Code Playgroud)

我看到很多其他人都看到了这个错误,但我无法理解这个问题的正确原因和解决方案.

如果有人能帮我解决这个问题,我真的很感激

Bri*_*kel 5

当a typealias在协议内使用时,它被称为协议关联类型声明,并且与"符合协议的最终类型"相关联Self.你会在核心Swift库中看到很多这样的东西,比如Sequences或基本类型.编译器需要Self信息才能完成其工作,因此失败.

好处是您不需要协议中的类型,并可以将其作为命名空间内的全局定义移出:

typealias ErrorBlock = (NSError?)->();

protocol STCMultipeerProtocol {

 func start();
 func stop();
 func retryConnecting();
 func disconnect();
}
Run Code Online (Sandbox Code Playgroud)

如果你有很多错误类型,你可以称之为MultipeerErrorBlock.