属性 'self.*' 未在 super.init 调用时初始化

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

我刚刚将 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

在任何初始化方法中调用 super.init 之前必须先初始化所有 属性

所以,在调用 super.init() 之前更改此设置

originView = sourceView //error here

异常:

  1. 可选属性
  2. 属性 默认值
  3. 懒惰属性

originView 可以由

为空
var originView: UIView?. 

如果您的 originView 不可为空,您必须在调用前提供默认值

super.init().

摘自 Apple 的“Swift 编程语言”一书:

“Swift 的编译器执行四个有用的 safety-checks 以确保两阶段初始化无误地完成”

“一个指定的初始化器必须确保它的 class 引入的所有“属性在它委托给超级class 初始化器之前被初始化。”

基本上你必须 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()

或使其 可为空

let originView: UIView?

懒惰属性

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
}