簡體   English   中英

初始化器鏈接('super.init')不能嵌套在另一個表達式中

[英]Initializer chaining ('super.init') cannot be nested in another expression

為什么我在此代碼中收到以下錯誤?

final class HomeViewController : someBaseClass {    

init(something: SomethingProtocol) {
            someFunction {
                self.something = something
                super.init(nibName: Self.nibName(), bundle: Bundle.main) //here
            }
        }
}

初始化器鏈接('super.init')不能嵌套在另一個表達式中

那是因為swift使用的兩階段初始化原理:

  • 首先(指定的)初始化程序必須確保 class 的每個存儲屬性都已初始化
  • 那么只有它可以調用超類初始化器,但仍然沒有在參數中引用 self,
  • 然后它可以做任何它想要的,特別是調用實例方法,讀取實例屬性的值,或者引用 self(因為至少 class 層次結構的所有屬性都將被初始化)。

在您的代碼中,您首先使用應該執行必要步驟的尾隨閉包調用 function。 這是不允許的,因為 function 不知道初始化的 state 並且可以假設 object 已經完成了階段 1。這就是您收到此錯誤消息的原因。

此外,對super.init()的調用在參數中引用了 self,而初始化的階段 1 尚未完成,引用 self 仍然是不安全的。 因此,即使您在調用閉包之前正確執行操作,您也會收到一條錯誤消息:

init(something: SomethingProtocol) {
    self.something = something
    super.init(nibName: self.nibName(), bundle: Bundle.main) // OUCH!!
    someFunction {
            ...
    }
}

錯誤消息也將是明確的:“ 'self' used in method call 'nibName' before 'super.init' call ”。 這是因為必須在調用之前評估參數並再次中斷兩階段初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM