如何在 swift 初始化程序中确定 Self 类

Posted

技术标签:

【中文标题】如何在 swift 初始化程序中确定 Self 类【英文标题】:How to determine Self class in swift initializers 【发布时间】:2016-08-18 22:27:02 【问题描述】:

在父类的便利初始化器中,如何在调用self.init()之前确定当前类?

public class Vehicle 

    public convenience init( withDictionary rawData: [String:AnyObject] ) 

        // how do I determine whether this is a Car here?

        self.init()

    



public class Car: Vehicle 



public class Bike: Vehicle 


【问题讨论】:

使用“is”关键字:***.com/a/24097894/2351432 你不应该相信。超类应该对它的子类一无所知。 @MattLogan "self is Car" 会引发错误,因为在 init() 之前不允许使用 self。不过,我发现self.dynamicType 是。请参阅下面的答案。 @ShadowOf 有有效的用例。例如,您想要执行适用于所有车辆的某些通用任务,但让每个特定子类为其目的实现此任务。在大多数情况下,您可以在调用 self.init() 之后执行此操作,但在我的情况下,我必须找到一种在 self.init() 之前调用它的方法,而静态方法就是答案。 @thatjuan 啊,当然。不确定这是否可能。对不起! 【参考方案1】:

似乎允许使用self.dynamicType

public class Vehicle 

    public convenience init( withDictionary rawData: [String:AnyObject] ) 

        let myType = self.dynamicType

        print( "This is a \(myType)" )

        self.init()

    



public class Car: Vehicle 



public class Bike: Vehicle 



let car = Car( withDictionary: ["key":"value"] )

// prints "This is a Car"

【讨论】:

【参考方案2】:

您需要使用“is”运算符来确定类的种类。

public class Vehicle 


  public convenience init( withDictionary rawData: [String:AnyObject] ) 
  

    self.init()

    if self is Car
    
      print("It's a car")
    
    else if self is Bike
    
      print("It's a bike")
    

  

但是,您也可以在 Car 或 Bike 的 init 函数中进行初始化。

【讨论】:

代码可以在 self.init() 调用之前运行很重要。此外,self.dynamic 允许使用该类型,而无需枚举每个可能的子类以确定它是哪一个。

以上是关于如何在 swift 初始化程序中确定 Self 类的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中覆盖 UIViewController 初始化

如何让类中的初始化方法等待 Firestore 在 Swift 4 中完成?

swift 类型系统 Self self Type

初始化需要“self”作为参数的 Swift 属性

如何在 Swift 的自定义类中初始化 Timer? [复制]

如何在 Swift Playground 中查看异常?