Swift泛型不保存类型

Swift泛型不保存类型,第1张

概述我正在尝试转换和/或根据指定的泛型类型生成变量。我知道swift中没有类型擦除,但是除了泛型的指定条件之外,它似乎不是泛型保留类型。符合基础类。看起来我可以转换或初始化是基类。更奇怪的是,当我在调试器中时,通用程序似乎有一个RawPointer到正确的类,甚至变量看起来像是正确的类型: 编辑: 从Xcode 6.1开始,这仍然是一个问题(Gregory Higley提供的简化代码): class 我正在尝试转换和/或根据指定的泛型类型生成变量。我知道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(){}。
这样,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泛型不保存类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052889.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存