问题与斯威夫特

问题描述:

相关类型的协议我有下列内容之一的框架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’只能作为一种通用的约束,因为它具有自我或ssociated型需求

我希望能够做的最后一件事。我的代码中是否存在一些错误,或者如果没有,是否存在针对此问题的其他解决方案?

非常感谢。

按照第二种方法,为什么不使用提供者,而不是PROVIDERPROTOCOL?既然你在Provider类的扩展证实typealias TProviderFramework.Model

class Consumer { 
    var provider: Provider? 
} 
+0

此: 扩展提供者:PROVIDERPROTOCOL { 公共FUNC乐趣(一些:ModelProtocol){} } 增加了一个功能,提供者类,这是不是我的观点。我想获得 公共FUNC乐趣(部分:模型) 功能以某种方式使Provider类符合PROVIDERPROTOCOL使原来的方法调用的乐趣功能时被调用。 –

+0

为什么不直接改变类供应商?听起来像Provider类被锁定,无法更改它?所以你想使用扩展来覆盖原来的行为? –

+0

如果我将Provider类更改为符合ProviderProtocol,则必须在ProviderFramework中导入UserFramework,以创建它们之间不相关的依赖关系。我想在导入它们的框架之外的第三个类中解析依赖项。 –