从NSObject

时间:2019-01-06 08:10:08

标签: ios swift

当我尝试在扩展NSObject的同时在私有函数中初始化变量时:

class MyClass: NSObject {

    private var _myVar: Int

    override init() {
        initializeMyVar()
        super.init()
    }

    private func initializeMyVar() {
        _myVar = 4
    }
}

我知道

  

在'super.init'调用之前在方法调用'initializeMyVar'中使用的'self'

如果我尝试在initializeMyVar()之前调用super.init(),但是要切换线路,以便首先调用super.init()

override init() {
    super.init()
    initializeMyVar()
}

我知道

  

未在super.init调用中初始化属性'self._myVar'

摆脱错误的唯一方法是摆脱私有函数并首先初始化变量。

override init() {
    _myVar = 4
    super.init()
}

这是为什么?扩展NSObject时是否无法在私有函数中初始化非可选成员变量?

2 个答案:

答案 0 :(得分:1)

使用自己的私有初始化程序的一种方法是将变量明确标记为non-optional。类似于以下代码:

class MyClass: NSObject {

    private var _myVar: Int!

    override init() {
        super.init()
        initializeMyVar()
    }

    private func initializeMyVar() {
        _myVar = 4
    }
}

答案 1 :(得分:1)

initializeMyVar()
super.init()

它与NSObject没有任何联系。当您调用超类的init时,这是一般规则;您无法在初始化对象或分配所有self变量之前调用non-optional的方法

_myVar = 4
super.init()

super.init()
initializeMyVar()

在第二种情况下,您在super.init()之后分配变量,则不给变量赋值,这是不可能的,因为那样您的值将具有nil,这也是不可能的,因为您的变量不是可选的。然后在这种情况下,将变量设为可选

private var _myVar: Int?