【发布时间】:2017-11-29 13:56:28
【问题描述】:
我知道在我的协议中使用typealias 的limitations。它阻止我做类似的事情:
protocol Provider {
associatedtype R
func receiveString(s: R)
}
struct ProviderManager {
let providers: [(Provider)]
}
因为ProviderManager不知道R的类型,所以报错:
Protocol '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。为什么不呢?
【问题讨论】:
-
在swift 4中,定义
protocol StringProvider: Provider where R == String { } -
当然可以,但是我要问的问题还是一样。
-
查看this question 及其答案