更新到Swift 1.2

时间:2015-06-16 17:58:08

标签: ios xcode swift ios8 xcode6.3.2

我很快更新了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<String>)而不是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()

4 个答案:

答案 0 :(得分:2)

尝试修改此部分。

 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调用的参数,以便将“override convenience init()”重定向到“init(sourceView:UIView,menuItems:Array)”。

答案 1 :(得分:0)

交换init(sourceView: UIView, menuItems:Array<String>)中的2行:

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

希望这会奏效。

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

答案 2 :(得分:0)

在调用超类初始值设定项之前,必须初始化所有非可选的可变属性和所有不可变属性(无论是否为可选):

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

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

let originView: UIView

答案 3 :(得分:0)

更改此行:

Should I maybe first check out which C standard this compiler conforms to

let originView:UIView!

你已经完成了。