我试图使用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)
我看到很多其他人都看到了这个错误,但我无法理解这个问题的正确原因和解决方案.
如果有人能帮我解决这个问题,我真的很感激
当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.
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |