web-dev-qa-db-ja.com

プロパティ 'self。*'は、super.init呼び出しで初期化されていません

Xcodeを6.3.1に更新しました。問題は、Swift 1.2以降、この奇妙なエラーメッセージが表示されたということです。この種のエラーメッセージが表示されました

/Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.Swift:32:15: Property 'self.originView' not initialized at super.init call

/Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.Swift:38:20: Immutable value 'self.originView' may only be initialized once

このコードで

let originView:UIView?

override init() {
        super.init() //error here

    }

    init(sourceView:UIView, menuItems:Array<String>){
        super.init() //error here
        originView = sourceView //error here
18
Mohammad Nurdin

Initメソッドでsuper.initを呼び出す前に、すべてのプロパティを初期化する必要があります

したがって、super.init()を呼び出す前にこれを変更してください

originView = sourceView //error here

例外:

  1. オプションのプロパティ
  2. デフォルト値を持つプロパティ
  3. 怠惰なプロパティ
22
user4201217

originViewをnull可能にする

var originView: UIView?. 

originViewをnullにできない場合は、呼び出す前にデフォルト値を指定する必要があります

super.init().
14
Nitheesh George

Appleの「Swiftプログラミング言語」の本から:

「Swiftのコンパイラは4つの役立つsafety-checks 2フェーズの初期化がエラーなしで完了することを確認します」

「指定された初期化子は、「そのクラスによって導入されたすべてのプロパティが、スーパークラスの初期化子に委任される前に初期化されることを保証する必要があります。」

基本的にはensure that your instance variables are in a consistent stateメソッドの呼び出しなど、何かを行う前。

class YourClass {
    var view: UIView
    init(view: UIView) {
        self.view = view
    }
}

あなたの場合はそれをnew UIViewにすることができます:

let originView = UIView()

またはそれを作るnullable

let originView: UIView?

または、代わりにlazy propertyを作成します。

lazy var originView: UIView = {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
    // customize it
    return view
}()

遅延インスタンス化を使用する場合は、メソッドを渡すことができます。

lazy var originView: UIView = self.createView()

func createView() -> UIView {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
        // customize it
        return view
}
3
Oleh Zayats