Swift中与关联类型的协议问题

时间:2017-06-02 23:20:49

标签: ios swift swift3 protocols swift-protocols

我有一个框架ProviderFramework,其中包含以下内容:

public class Provider {

    public func fun(some: Model) {

    }

}

public class Model {

    public let id: Int

    init(id: Int) {
        self.id = id
    }

}

以及另一个包含以下内容的UserFramework:

public protocol ProviderProtocol {

    func fun(some: ModelProtocol)

}

public protocol ModelProtocol {

    var id: Int {get}

}

我想要的是使Provider类符合ProviderProtocol类。因此,在导入前面提到的两个框架的框架中,我有这个:

extension ProviderFramework.Model: UserFramework.ModelProtocol {}
extension ProviderFramework.Provider: UserFramework.ProviderProtocol {}

不幸的是,这会导致第二次一致性出错。 所以,我尝试使用相关的类型,我的ProviderProtocol变成了这个:

public protocol ProviderProtocol {

    associatedtype T: ModelProtocol

    func fun(some: T)

}

以及与此有关的问题:

extension ProviderFramework.Provider: UserFramework.ProviderProtocol {
    public typealias T = ProviderFramework.Model
}

现在没有任何编译错误,但如果我想将协议用作这样的类型:

class Consumer {

    var provider: ProviderProtocol?

}

我再次收到错误:“协议'ProviderProtocol'只能用作通用约束,因为它具有Self或关联类型要求”

我希望能够做到最后一件事。我的代码中是否有一些错误,或者是否有针对此问题的替代解决方案?

提前多多感谢。

1 个答案:

答案 0 :(得分:0)

根据第二种方法,为什么不使用Provider而不是ProviderProtocol?由于您在类typealias T的扩展名中确认ProviderFramework.ModelProvider

class Consumer {
    var provider: Provider?
}