Swift协议作为一种类型

时间:2014-08-22 22:52:38

标签: 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?
 ....
}

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

Protocol 'STCMultipeerProtocol' can only be used as a generic constraint because it has Self or associated type requirements.

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

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

1 个答案:

答案 0 :(得分:5)

在协议中使用typealias时,它被称为协议关联类型声明,并且与符合协议的"最终类型相关联&# 34;又名Self。您可以在核心Swift库中看到这些内容,例如序列或基本类型。编译器需要Self信息才能完成工作,因此失败了。

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

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

protocol STCMultipeerProtocol {

 func start();
 func stop();
 func retryConnecting();
 func disconnect();
}

如果您有很多错误类型,可以将其称为MultipeerErrorBlock