1

我很快更新到 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。

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

PS由于这段代码,它不是这个问题的重复: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

4 回答 4

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

于 2015-06-16T18:12:19.613 回答
0

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

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

希望这会奏效。

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

于 2015-06-16T18:05:37.327 回答
0

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

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

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

let originView: UIView
于 2015-06-16T18:09:23.707 回答
0

改变你的这一行:

let originView:UIView!

var originView:UIView!

你完成了。

于 2015-06-17T12:05:27.763 回答