【发布时间】: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