Property 'self.*' not initialized at super.init call
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
}
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:
- optional property
- property with default value
- lazy property
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().