为什么具有类型的协议不足以满足相关的类型要求?

时间:2017-11-29 13:56:29

标签: swift generics

我知道在我的协议中使用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。为什么不呢?

2 个答案:

答案 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]
}