如何在Swift中实现泛型类工厂?

时间:2018-01-02 02:45:03

标签: swift swift4 swift-protocols class-factory

我想“制作”一些类似于基类的类实例,但底层类型不同。 (与网上看到的典型“动物”级工厂示例不完全相同!)

下面的代码接近工作,但它要求用户“转发”make结果,如:

var f1 = FOO.make(version: FOO.Ver.f1) as! FOO1_32

我不希望用户知道特定的类类型,除了它是FOO。我已经看到了其他提议,它们都表明解决方案是使用符合协议的泛型类型定义make,如:

make<T: FOOProtocol>(version: Ver = .f1) -> T

然而,这给我一个错误“在FOO.make(版本:FOO.Ver.f1)的调用中无法推断出通用参数'T'

任何人都知道如何做到这一点?我的Playground代码如下。

protocol FOOProtocol
{
    associatedtype FOOtype
    var value: FOOtype {get set}
}

class FOO
{
    enum Ver
    {
        case f1
        case f2
    }

    class func make(version: Ver = .f1) -> FOO
    {
        print("FOO make")
        switch version
        {
        case .f1:
            return FOO1_32()

        case .f2:
            return FOO2_64()
        }
    }
}

class FOO1_32: FOO, FOOProtocol
{
    typealias FOOtype = UInt32

    private var fooVal: UInt32 = 0
    var value: UInt32
    {
        get { return self.fooVal }
        set { self.fooVal = newValue }
    }

    override init()
    {
        print("FOO1_32 init")
        self.fooVal = 132
    }
}

class FOO2_64: FOO, FOOProtocol
{
    typealias FOOtype = UInt64

    private var fooVal: UInt64 = 0
    var value: UInt64
    {
        get { return self.fooVal }
        set { self.fooVal = newValue }
    }

    override init()
    {
        print("FOO2_64 init")
        self.fooVal = 264
    }
}

var f1 = FOO.make(version: FOO.Ver.f1)  // requires: as! FOO1_32
let f1v = f1.value
print("\(f1v)")

var f2 = FOO.make(version: FOO.Ver.f2)  // requires: as! FOO2_64
let f2v = f2.value
print("\(f2v)")

0 个答案:

没有答案