Swift泛型不保存类型
|
我正在尝试转换和/或根据指定的泛型类型生成变量。我知道swift中没有类型擦除,但是除了泛型的指定条件之外,它似乎不是泛型保留类型。符合基础类。看起来我可以转换或初始化是基类。更奇怪的是,当我在调试器中时,通用程序似乎有一个RawPointer到正确的类,甚至变量看起来像是正确的类型:
编辑: 从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(){}。 没有它,可以制作非法的子类,如: 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 我想,那就是你问题的原因。 无论如何,那是谁的错? >编译器应该警告模糊。 添加: 从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()
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
