此代码按预期工作。
class BaseClass {
required init() {} // <-- ADDED THIS
func printme() -> Void {
println("I am BaseClass")
}
}
class DerivedClass : BaseClass {
override func printme() -> Void {
println("I am DerivedClass")
}
}
class Util<T: BaseClass> {
func doSomething() {
var instance = T()
instance.printme()
}
}
var util = Util<DerivedClass>()
util.doSomething()
代码库是从@GregoryHigley答案:)
标记init() {}
为required
做的东西被盗。 这保证了init()
是的任何指定初始值设定项从BaseClass
的任何派生类。
没有它,可以使非法的子类,如:
class IllegalDerivedClass : BaseClass {
var name:String
init(name:String) {
self.name = name
super.init()
}
override func printme() -> Void {
println("I am DerivedClass")
}
}
var util = Util<IllegalDerivedClass>()
util.doSomething()
你知道这并不因为IllegalDerivedClass
doesn't inherit init()
initializer工作。
我想,这是你的问题的原因。
无论如何,谁的错?
- 编译器应警告模糊性。
- 运行时间应尝试初始化
DerivedClass()
,如T
所述。
- 调试器应该显示
instance
是BaseClass
的一个实例,因为它实际上是。
新增:
作为的Xcode 6.1通用汽车2,看来,你需要更多的工作。 (除required init() {}
)
class Util<T: BaseClass> {
let theClass = T.self // store type itself to variable
func doSomething() {
var instance = theClass() // then initialize
instance.printme()
}
}
我完全不知道为什么我们需要这个,这是怎么回事X(
新增:二○一四年十月一十八日
我发现这也适用:
func doSomething() {
var instance = (T.self as T.Type)()
instance.printme()
}
新增:2015年2月10日
随着版本的Xcode 6.3(6D520o)的/雨燕1.2
我们不再需要(T.self as T.Type)()
破解。只要T()
工作,只要T
有required init()
初始值设定项。
class Util<T: BaseClass> {
func doSomething() {
var instance = T()
instance.printme()
}
}
您应该更改rintaro的正确答案。 – 2014-10-09 17:40:37
@rfrittelli - 其实正确的答案是JeremyP的。我已经证实它的工作原理,而rintaro的答案不再适用于最新的XCode。 – Lee 2014-10-16 16:25:59
你的原始输出是什么(它会有帮助)?从6.1开始,两个测试都会得到相同的结果,这是预期的结果。你也可以陈述你的问题吗? – 2014-11-13 02:35:31