Swift泛型不保存类型

前端之家收集整理的这篇文章主要介绍了Swift泛型不保存类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试转换和/或根据指定的泛型类型生成变量。我知道swift中没有类型擦除,但是除了泛型的指定条件之外,它似乎不是泛型保留类型。符合基础类。看起来我可以转换或初始化是基类。更奇怪的是,当我在调试器中时,通用程序似乎有一个RawPointer到正确的类,甚至变量看起来像是正确的类型:

编辑:

从Xcode 6.1开始,这仍然是一个问题(Gregory Higley提供的简化代码):

  1. class BaseClass {
  2. func printme() -> Void {
  3. println("I am BaseClass")
  4. }
  5. }
  6.  
  7. class DerivedClass : BaseClass {
  8. override func printme() -> Void {
  9. println("I am DerivedClass")
  10. }
  11. }
  12.  
  13. class Util<T: BaseClass> {
  14. func doSomething() {
  15. var instance = T()
  16. instance.printme()
  17. }
  18. }
  19.  
  20. var util = Util<DerivedClass>()
  21. util.doSomething()

仍打印出“我是BaseClass”

还要注意,基类中所需的init {}不再有效。

代码按预期工作。
  1. class BaseClass {
  2.  
  3. required init() {} // <-- ADDED THIS
  4.  
  5. func printme() -> Void {
  6. println("I am BaseClass")
  7. }
  8. }
  9.  
  10. class DerivedClass : BaseClass {
  11. override func printme() -> Void {
  12. println("I am DerivedClass")
  13. }
  14. }
  15.  
  16. class Util<T: BaseClass> {
  17. func doSomething() {
  18. var instance = T()
  19. instance.printme()
  20. }
  21. }
  22.  
  23. var util = Util<DerivedClass>()
  24. util.doSomething()

代码库从@GregoryHigley的答案中被盗

根据需要标记init(){}。
这样,init()就是来自BaseClass的ANY派生类的指定的初始化器。

没有它,可以制作非法的子类,如:

  1. class IllegalDerivedClass : BaseClass {
  2. var name:String
  3.  
  4. init(name:String) {
  5. self.name = name
  6. super.init()
  7. }
  8.  
  9. override func printme() -> Void {
  10. println("I am DerivedClass")
  11. }
  12. }
  13.  
  14. var util = Util<IllegalDerivedClass>()
  15. util.doSomething()

你知道这不工作,因为IllegalDerivedClass doesn’t inherit init() initializer

我想,那就是你问题的原因。

无论如何,那是谁的错?

>编译器应该警告模糊。
>运行时应该尝试用T来指定DerivedClass()。
> Debugger应该显示实例是一个BaseClass的实例,因为它实际上是。

添加

从Xcode 6.1 GM 2起,似乎需要更多的工作。 (除了必需的init(){})

  1. class Util<T: BaseClass> {
  2. let theClass = T.self // store type itself to variable
  3.  
  4. func doSomething() {
  5. var instance = theClass() // then initialize
  6. instance.printme()
  7. }
  8. }

我完全不知道为什么我们需要这个,X

新增:二〇一四年十月十八日

我发现这也有效:

  1. func doSomething() {
  2. var instance = (T.self as T.Type)()
  3. instance.printme()
  4. }

添加日期:2015/02/10

截至Xcode Version 6.3(6D520o)/ Swift 1.2

我们不再需要(T.self as T.Type)()hack。只要T()工作,只要T需要init()初始化程序。

  1. class Util<T: BaseClass> {
  2. func doSomething() {
  3. var instance = T()
  4. instance.printme()
  5. }
  6. }

猜你在找的Swift相关文章