20

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

3 回答 3

25

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

所以,在你调用 super.init() 之前改变它

originView = sourceView //error here

例外:

  1. 可选属性
  2. 具有默认值的属性
  3. 懒惰的财产
于 2015-04-27T08:23:32.773 回答
15

originView通过_

var originView: UIView?. 

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

super.init().
于 2015-04-27T08:35:53.977 回答
6

来自 Apple 的“The Swift Programming Language”一书:

“Swift 的编译器执行了四项有助于safety-checks确保两阶段初始化完成无错误”</p>

“指定的初始化器必须确保所有“由其类引入的属性在它委托给超类初始化器之前都已初始化。”</p>

基本上你必须ensure that your instance variables are in a consistent state在你做任何事情之前,包括调用方法。

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

好吧,在您的情况下,您可以将其设为新的 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
}
于 2017-03-18T16:23:33.273 回答