我知道在我的协议中使用typealias
的{{3}}。它阻止我做类似的事情:
protocol Provider {
associatedtype R
func receiveString(s: R)
}
struct ProviderManager {
let providers: [(Provider)]
}
由于ProviderManager
不知道R
的类型,因此会抱怨错误消息:
协议'Provider'只能用作通用约束,因为它具有Self或相关类型要求
但是,为什么我不能引入指定相关类型的中间协议?类似的东西:
protocol Provider {
associatedtype R
func receiveString(s: R)
}
protocol StringProvider: Provider {
typealias R = String
}
struct ProviderManager {
let providers: [(StringProvider)]
}
即使实现StringProvider
协议按预期工作,上述操作仍无效:
final class MyStringProvider: StringProvider {
func receiveString(s: String) {
//do something
}
}
MyStringProvider
的上述实现有效。但我仍然无法在数组中使用StringProvider
。为什么不呢?
答案 0 :(得分:0)
协议'Provider'只能用作通用约束,因为它具有Self或相关类型要求
要删除此错误,您必须以这种方式创建结构:
struct ProviderManager<P: Provider> {
var providers: [P]
}
修改强>
你可以像这样实例化你的经理:
let manager: ProviderManager = ProviderManager(providers: [MyStringProvider()])
答案 1 :(得分:0)
您无法创建“协议”类型的变量/属性。您可以创建符合协议的某种类型的变量/属性(在您的情况下是一个数组)。试试这个:
protocol StringProvider : Provider where R == String {
}
struct StringProviderStruct : StringProvider {
func receiveString(s: String) {
}
}
struct ProviderManager {
let providers: [StringProviderStruct]
}