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

Moh*_*din 17 ios swift xcode6.3.1

我刚刚将我的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
Run Code Online (Sandbox Code Playgroud)

在这个代码上

let originView:UIView?

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

    }

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

请指教.谢谢.

小智 22

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

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

originView = sourceView //error here
Run Code Online (Sandbox Code Playgroud)

例外:

  1. 可选属性
  2. 具有默认值的属性
  3. 懒惰的财产


Nit*_*rge 14

让你的originView可空

var originView: UIView?. 
Run Code Online (Sandbox Code Playgroud)

如果您originView不可为空,则必须在致电前提供默认值

super.init().
Run Code Online (Sandbox Code Playgroud)


Ole*_*ats 5

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

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

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

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

class YourClass {
    var view: UIView
    init(view: UIView) {
        self.view = view
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,在您的情况下,您可以将其设为新的 UIView

let originView = UIView()
Run Code Online (Sandbox Code Playgroud)

或者让它可以为

let originView: UIView?
Run Code Online (Sandbox Code Playgroud)

或者创建一个惰性属性

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

使用延迟实例化时,您可以传递一个方法:

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
}
Run Code Online (Sandbox Code Playgroud)

  • @Edgar 这真的取决于。没有最好的方法,你需要考虑你的类应该如何表现,它应该有什么状态以及取决于你编写代码的信息。尝试先在纸上描述您的课程,然后编写代码,很快您就会自动完成脑海中的所有事情。 (2认同)