Property 'self.*' not initialized at super

2020-02-05 02:54发布

I just updated my xcode to 6.3.1. The problem is I got this weird error message since Swift 1.2. I got this kind of error message

/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

on this code

let originView:UIView?

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

    }

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

3条回答
冷血范
2楼-- · 2020-02-05 03:08

Make your originView nullable by

var originView: UIView?. 

If your originView is not nullable you have to provide a default value before calling

super.init().
查看更多
地球回转人心会变
3楼-- · 2020-02-05 03:21

You have to initialize all property before you call super.init in any init method

So,change this before you call super.init()

originView = sourceView //error here

Exception:

  1. optional property
  2. property with default value
  3. lazy property
查看更多
4楼-- · 2020-02-05 03:23

From Apple's “The Swift Programming Language” book:

“Swift’s compiler performs four helpful safety-checks to make sure that two-phase initialization is completed without error”

“A designated initializer must ensure that all of the “properties introduced by its class are initialized before it delegates up to a superclass initializer.”

Basically you have to ensure that your instance variables are in a consistent state before you do anything, including calling methods.

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

well in your case you can make it a new UIView:

let originView = UIView()

or make it nullable

let originView: UIView?

or make a lazy property instead:

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

when using lazy instantiation you can pass a method:

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
}
查看更多
登录 后发表回答