Swift中的工厂使用通用类型

时间:2016-09-09 02:08:28

标签: ios swift generics swift2 generic-programming

我正在尝试在Swift中实现以下功能 - 我希望将类型传递给通用的“get”函数,并根据该类型和参数,使用不同的存储库来获取类。

我认识到这样做有点奇怪,但它会节省我很多时间,让我以后更适当地重构一些东西。 这是代码,但它在Foo1Repository和Foo2Repository行上编译错误“无法将Foo1Repository的类型转换为T”。

基本上Foo1Repository应该返回一个Foo1,当然它继承自BaseEntity(对于Foo2也是如此)

class func Get<T: BaseEntity>(id: Int) -> T
{
    if (T is Foo1) {
        return Foo1Repository.Get(id)
    }
    else if (T == Foo2) {
        return Foo2Repository.Get(id)
    }

    return T()
}

我希望通过以下方式调用此函数:

let foo = FactoryClass.Get<Foo1>(1)

我立刻明白你会问“为什么不打电话给合适的资料库,”。

let foo = Foo1Repository.Get(1) 

你们都准备好了!这里不需要一些奇怪的工厂模式。

我们现在就说,我需要尝试在上面执行此操作而不需要对我继承的一些代码进行大量重构。我稍后会回去计划一个合适的重构。

所以我尝试了一些组合,但似乎仍然无法克服编译错误。这样的事情是可能的,还是我需要咬紧牙关走另一条路?非常感谢!

1 个答案:

答案 0 :(得分:1)

所以我明白了!我想分享答案,以便其他人可以看到如何做到这一点。希望它会有所帮助。

 func Get<T: BaseEntity>(id: Int) -> T
    {
        if (T.self == Foo1.self) {
            return Foo1Repository.Get() as! T
        }
        else if (T.self == Foo2.self) {
            return Foo2Repository.Get() as! T
        }
        ...

        return T()
    }

所以你可以看到,整体如此!最后的T是关键。另外==而不是类型检查。