泛型协议在Swift中的类型

时间:2017-10-06 01:53:20

标签: swift generics swift-protocols

如何创建协议变量。我的目标是协议将具有泛型类型的函数,并且我使用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声明这个?

1 个答案:

答案 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都可以使用扩展名。