问题与斯威夫特
问题描述:
相关类型的协议我有下列内容之一的框架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 T
为ProviderFramework.Model
。
class Consumer {
var provider: Provider?
}
此: 扩展提供者:PROVIDERPROTOCOL { 公共FUNC乐趣(一些:ModelProtocol){} } 增加了一个功能,提供者类,这是不是我的观点。我想获得 公共FUNC乐趣(部分:模型) 功能以某种方式使Provider类符合PROVIDERPROTOCOL使原来的方法调用的乐趣功能时被调用。 –
为什么不直接改变类供应商?听起来像Provider类被锁定,无法更改它?所以你想使用扩展来覆盖原来的行为? –
如果我将Provider类更改为符合ProviderProtocol,则必须在ProviderFramework中导入UserFramework,以创建它们之间不相关的依赖关系。我想在导入它们的框架之外的第三个类中解析依赖项。 –