加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在swift中调用超级指定初始化程序之前初始化属性值的目的是什么

发布时间:2020-12-14 04:45:58 所属栏目:百科 来源:网络整理
导读:这是我的代码: 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 ca
这是我的代码:

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和超类的初始化顺序是否真的无关紧要.

解决方法

你的论点

I think this should be compiled:

y is not visible inside class ‘Base’,whether order of initializations
of y’s and super class’s doesn’t really matter.

这是不正确的,这是不安全的.

超类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已经解决的问题之一(以更严格的要求为代价).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读