如何创建协议变量。我的目标是协议将具有泛型类型的函数,并且我使用associatedtype
访问Class
并且该函数将返回泛型类型。下面的示例声明:
public protocol ComponentFactory {
associatedtype T // A class and that class can be inherit from another so I need define generic type here
func create() -> T
}
我想为此协议声明一个变量:
fileprivate var mComponentFactoryMap = Dictionary<String, ComponentFactory>()
在这一行我收到一个错误:
Protocol 'ComponentFactory' can only be used as a generic constraint because it has Self or associated type requirements
我从Android看到,实际上来自kotlin他们有interface
的声明,如:
private val mComponentFactoryMap = mutableMapOf<String, ComponentFactory<*>>()
任何人都可以帮助我,我怎么能从Swift声明这个?
答案 0 :(得分:2)
几个月前,我已经通过以下说明解决了这个问题。请检查它,如果有,请给我另一个解决方案。
首先,对Protocol
进行一些更改。在associatedtype T
处应更改为associatedtype Component
,并且Component
是一个将从另一个类继承的类(重要步骤)。
public protocol ProComponentFactory {
associatedtype Component
func create() -> Component?
}
第二,我将继承Generic Struct
继承一个ProComponentFactory
:
public struct ComponentFactory<T>: ProComponentFactory {
public typealias Component = T
public func create() -> T? { return T.self as? T }
}
做得好,现在您可以定义一个变量,如我在上面的问题中的示例所示:
fileprivate var mComponentFactoryMap = Dictionary<String, ComponentFactory<Component>>()
对于任何从Component
继承的类,变量mComponentFactoryMap
都可以使用扩展名。