在swift中,我无法在super.init()之前或之后初始化事物

o.u*_*inn 1 initialization optional swift

我希望能够使用self初始化属性subviewGroup但是这给了我错误:属性'self.gridView'未在super.init调用时初始化

init(frame: NSRect) {
    super.init(frame: frame)
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self)
}

/***  Properties  ***/
let subviewGroup: GridViewGroup
Run Code Online (Sandbox Code Playgroud)

然后如果我在初始化后把super.init()放到这样的话

init(frame: NSRect) {
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self)
    super.init(frame: frame)
}

/***  Properties  ***/
let subviewGroup: GridViewGroup
Run Code Online (Sandbox Code Playgroud)

我收到错误:在super.init调用之前使用'self'

我知道我可以使用一个Optional,但是因为在init()调用之后它永远不会是nil似乎没必要.有没有办法正确地做到这一点,而不使subviewGroup成为可选项?

这是一个使用可选的工作示例

/***  Initializers  ***/
init(frame: NSRect) {
    super.init(frame: frame)
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self)
}

/***  Properties  ***/
let subviewGroup: GridViewGroup?
Run Code Online (Sandbox Code Playgroud)

Con*_*nor 5

这正是隐式解包的期权有用的东西.您可以像这样轻松地将它们添加到您的示例中:

/***  Initializers  ***/
init(frame: NSRect) {
    super.init(frame: frame)
    subviewGroup = GridViewGroup(rows: 9, columns: 9, gridView: self)
}

/***  Properties  ***/
let subviewGroup: GridViewGroup!
Run Code Online (Sandbox Code Playgroud)

使用隐式展开的可选项允许您将变量视为不可选,并在调用时直接访问底层变量.

使用普通的可选代码,您的代码可能看起来像var nonoptional: GridViewGroup = subviewGroup!隐藏的解包选项,您可以丢弃!:var nonoptional: GridViewGroup = subviewGroup.

来自Apple的文档:

当在首次定义可选项之后立即确认可选的值存在时,隐式展开的选项很有用,并且可以假定在此后的每个点都存在.Swift中隐式解包选项的主要用途是在类初始化期间