Swift 中的工厂使用通用类型

Factory in Swift using Generic Types

我正在尝试在 Swift 中实现以下目标 - 我想将类型传递给通用 "get" 函数,并基于该类型和参数,使用不同的存储库来找回 class.

我知道这样做有点奇怪,但它会节省我很多时间,让我以后可以更适当地重构一些东西。 这是代码,但它在 Foo1Repository 和 Foo2Repository 行 "Cannot convert the type of Foo1Repository to T".

上编译错误

基本上Foo1Repository应该return一个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)

我马上明白你会问"why not just call the appropriate repository, i.e."

let foo = Foo1Repository.Get(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 是关键。同样 == 而不是 is 用于类型检查。