如何在 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 中完成?