大佬教程收集整理的这篇文章主要介绍了在swift中调用超级指定初始化程序之前初始化属性值的目的是什么?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class Base { init(){ print("Super!") } } class Test : Base { internal var y:Int convenience init(_ a:int) { self.init() print("\(a)") } override init() { super.init() //Error!!! Property 'self.y' not initialized at super.init call y = 123 } }
我认为应该编译:
y在类’Base’中是不可见的,y和超类的初始化顺序是否真的无关紧要.
这是不正确的,这是不安全的.
超类init可以调用实例
在子类中重写的方法.那是(至少一个)
之所以必须在调用super.init()之前初始化所有子类属性的原因.
class Base { init(){ print("enter Base.init") setup() print("leave Base.init") } func setup() { print("Base.setup called") } } class Test : Base { internal var y:Int override init() { y = 123 print("before super.init") super.init() print("after super.init") } override func setup() { print("Test.setup called") print("y = \(y)") } }
输出:
before super.init enter Base.init Test.setup called y = 123 leave Base.init after super.init
如您所见,访问子类的y属性
在super.init()调用期间,即使它不知道
超类.
比较Objective-C中的情况可能会很有趣
其中self = [super initXXX]总是先调用.这有
结果是属性访问init / dealloc方法中的self.prop
是不安全的,直接访问实例变量_prop是
建议因为对象可能处于“部分构造状态”.
参见例如Should I refer to self.property in the init method with ARC?.
所以这是Swift已经解决的问题之一(以更严格的要求为代价).
以上是大佬教程为你收集整理的在swift中调用超级指定初始化程序之前初始化属性值的目的是什么?全部内容,希望文章能够帮你解决在swift中调用超级指定初始化程序之前初始化属性值的目的是什么?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。