【问题标题】:Error after update to Swift 1.2更新到 Swift 1.2 后出错
【发布时间】:2015-06-16 17:58:07
【问题描述】:

我很快更新到 Xcode 6.3.2 附带的 Swift 1.2 并编写了几行代码:

let originView:UIView!

  override init() {

      super.init()

  }

  init(sourceView:UIView, menuItems:Array<String>){

      super.init()

      originView = sourceView
  }

此代码运行完美,直到我更新了新版本的 Xcode (6.3.2)。

现在我收到以下错误:Property 'self.originView' not initialized at super.init call

直到现在我还没有找到解决方案,因为我还在学习 Swift。

你们中有人知道我该如何解决这个问题吗?

P.S 这不是 this question 的重复,因为这段代码:init(sourceView:UIView, menuItems:Array&lt;String&gt;) 而不是 override init(frame: CGRect)

更新:

新代码:

override convenience init() {

    self.init()
}

init(sourceView:UIView, menuItems:Array<String>){

    originView = sourceView
    super.init()
}

新错误: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5f300ff8) 在这行代码中:self.init()

【问题讨论】:

    标签: ios xcode swift ios8 xcode6.3.2


    【解决方案1】:

    尝试修改这部分。

     override init() {
    
          super.init()
    
      }
    

      override init() {
    
          self.init(UIView(), nil) // Or other initial values 
    
      }
    

    如果这不能解决您的错误,这是更好的方法,因为 init() 会调用您的自定义 init 并初始化您的变量。

    更新时编辑

    你的修改不正确

      override convenience init() {
    
          self.init() // This init referred "override convenience init()" !! So recursive call
    
      }
    

    您必须像我之前所说的那样提供 init 调用的参数,以便将“覆盖便利 init()”重定向到“init(sourceView:UIView, menuItems:Array)”。

    【讨论】:

    • 对于第二个参数中的“nil”,您需要使用“init(sourceView:UIView, menuItems:Array!)”更改初始化的原型
    【解决方案2】:

    改变你的这一行:

    let originView:UIView!
    

    var originView:UIView!
    

    你就完成了。

    【讨论】:

      【解决方案3】:

      在调用超类初始化程序之前,您必须初始化所有非可选的可变属性和所有不可变属性(无论是否可选):

      init(sourceView:UIView, menuItems:Array<String>){
          originView = sourceView
          super.init(frame: CGRect.zeroRect)
      }
      

      请注意,由于originView 属性是不可变的,因此您实际上不需要将其设为隐式展开的可选。传递给初始化程序的 sourceView 参数不是可选的,因此您可以将该属性设为非可选:

      let originView: UIView
      

      【讨论】:

        【解决方案4】:

        交换init(sourceView: UIView, menuItems:Array&lt;String&gt;)中的2行:

        init(sourceView:UIView, menuItems:Array<String>){
              originView = sourceView
              super.init()
          }
        

        希望这会奏效。

        编辑:在您的第一个函数中调用 super.init()

        【讨论】:

        • 我在编辑器中没有收到错误,但如果我运行应用程序,我会崩溃。我用错误消息更新了我的问题,崩溃线...。希望你能帮助我。
        • 如果我在override convenience init() 中将self.init() 替换为super.init(),我会收到以下错误:Convenience initializer for 'SideBar' must delegate (with 'self.init') rather than changing to a superclass initializer (with 'super.init')
        • 删除关键字方便。
        • 我删除了convenience。现在我收到以下错误:Property 'self.orignView' not initialized at super.init call.
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2016-01-22
        相关资源
        最近更新 更多