【问题标题】:Factory in Swift using Generic Types使用泛型类型在 Swift 中进行工厂
【发布时间】:2016-09-09 02:08:28
【问题描述】:

我正在尝试在 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) 

一切就绪!这里不需要一些奇怪的工厂模式。

假设现在我需要尝试在上面做这件事,而不需要对我继承的一些代码进行大量重构。稍后我会重新规划适当的重构。

所以我尝试了多种方法,但似乎仍然无法克服编译器错误。这样的事情可能吗,还是我需要硬着头皮走另一条路?非常感谢!

【问题讨论】:

  • 一个问题,您是否尝试实现存储库模式?因为它离它很近。
  • 是的,虽然在 Swift 的上下文中有点困难 / 使用 FMDB / SQLITE 所以没有 ORM

标签: ios swift generics swift2 generic-programming


【解决方案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 是关键。还有 == 而不是用于类型检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2021-01-30
    • 2017-06-07
    相关资源
    最近更新 更多