作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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)
一切就绪!这里不需要一些奇怪的工厂模式。
我们只是说,目前我需要尝试在不对我继承的某些代码进行大量重构的情况下完成上面的操作。稍后我会回来计划适当的重构。
所以我尝试了各种组合,但似乎仍然无法克服编译器错误。这样的事情是可能的,还是我需要硬着头皮走另一条路?非常感谢!
最佳答案
所以我想通了!我想分享答案,以便其他人可以看到如何做到这一点。希望它会有所帮助。
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 用于类型检查。
关于ios - 使用泛型类型的 Swift 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39402772/
我是一名优秀的程序员,十分优秀!