【问题标题】:Property 'self.*' not initialized at super.init call属性 'self.*' 未在 super.init 调用中初始化
【发布时间】:2015-07-05 14:20:09
【问题描述】:

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

【问题讨论】:

标签: ios swift xcode6.3.1


【解决方案1】:

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

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

originView = sourceView //error here

例外:

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

【讨论】:

  • 我已经初始化了我的属性。检查我的问题。还是错误。
  • 这个答案似乎与问题中的代码不太匹配。这种情况下的问题不在于分配值的位置,问题在于您无法使用let 声明可选属性。
【解决方案2】:

让您的originView 可以为

var originView: UIView?. 

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

super.init().

【讨论】:

  • 让 originView:UIView!。您使用“let”将 originView 声明为常量。它应该是“var”。当您使用“let”时,除了在声明期间,您将不能再次更改它的值。
  • 你是对的,对不起我的错误。让我先试试。
【解决方案3】:

来自 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
    }
}

在您的情况下,您可以将其设为新的 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
}

【讨论】:

  • 什么是更好的做法?使用 nullablelazy 属性?
  • @Edgar 这真的取决于。没有最好的方法,你需要考虑你的类应该如何表现,它应该有什么状态以及取决于你编写代码的信息。试着先在纸上描述你的课程,然后编写代码,很快你就会自动完成所有的事情。
猜你喜欢
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多