编辑:
从Xcode 6.1开始,这仍然是一个问题(Gregory Higley提供的简化代码):
class BaseClass { 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()
仍打印出“我是BaseClass”
还要注意,基类中所需的init {}不再有效。
此代码按预期工作。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(){}。
这样,init()就是来自BaseClass的ANY派生类的指定的初始化器。
没有它,可以制作非法的子类,如:
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。
我想,那就是你问题的原因。
无论如何,那是谁的错?
>编译器应该警告模糊。
>运行时应该尝试用T来指定DerivedClass()。
> DeBUGger应该显示实例是一个BaseClass的实例,因为它实际上是。
添加:
从Xcode 6.1 GM 2起,似乎需要更多的工作。 (除了必需的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/02/10
截至Xcode Version 6.3(6D520o)/ Swift 1.2
我们不再需要(T.self as T.Type)()Hack。只要T()工作,只要T需要init()初始化程序。
class Util<T: BaseClass> { func doSomething() { var instance = T() instance.printme() }}总结
以上是内存溢出为你收集整理的Swift泛型不保存类型全部内容,希望文章能够帮你解决Swift泛型不保存类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)