Property 'self.*' not initialized at super.init call

梦想与她 提交于 2019-11-27 02:40:08

问题


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

回答1:


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



回答2:


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:


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
}


来源:https://stackoverflow.com/questions/29890510/property-self-not-initialized-at-super-init-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!