【发布时间】:2014-08-17 06:32:46
【问题描述】:
我正在 Swift 中实现一个类 Foo,它应该实例化 SuperBar 的给定 子类 的对象,例如Bar: SuperBar。我真的很喜欢 Swift 中的泛型,所以我尝试以这种方式实现它:
class Foo<T: SuperBar> {
func instantiateObject() -> T {
return T()
}
}
class SuperBar {
}
class Bar: SuperBar {
}
let foo = Foo<Bar>()
let obj = foo.instantiateObject()
您可以在 Xcode Playground 中运行代码 sn-p 并观察 obj 的类型为 SuperBar 而不是 Bar,尽管当我 Alt 时它显示 Bar-点击常量名。
有什么想法吗? :)
【问题讨论】:
-
这可能是当前版本的 Swift 的一个缺点;考虑filing a bug。如果您将类型作为参数传递,它似乎也不起作用,例如
init(_ t: T.Type) { ... t() }