尝试覆盖Xcode 6.3 Beta 3中的初始化程序时生成错误

时间:2015-03-16 01:57:12

标签: swift xcode6.3

以下代码显示了Xcode 6.3 Beta 3 中的构建错误。该代码适用于Xcode 6.2和Xcode 6.3 Beta 2。

class MyView: UIView {
  override init() {
    super.init()
    // Some init logic ...
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

错误消息

  

初始化程序不会覆盖其超类

中的指定初始值设定项

解决方法

使用Beta 3 release notes中提到的init方法创建协议有一种可能的解决方法。我无法同时使用initinit(frame: CGRect)初始值设定项。

如何解决这些构建错误?

3 个答案:

答案 0 :(得分:17)

子类的指定初始值设定项需要调用Superclass的指定初始值设定项。便捷初始化器只能调用另一个便利初始化器或该类的指定初始化器。

init()是UIView的一个便利初始化器,如果你是UIView的子类,你应该调用它的指定初始化器,它是init(frame:frame)

override init() {
super.init(frame: frame)
// Some init logic ...
}
编辑:显然在Beta 3中,UIView没有称为init的便捷初始化程序,所以你也需要删除override关键字,现在这是一个指定的初始化程序,所以你需要调用超类指定的初始化器

init() {
super.init(frame: frame)
// Some init logic ...
}

编辑:虽然这有效,但我认为更好的方法是写:

convenience init() {
self.init(frame:CGRectZero)
}

来源:Swift documentation

  

规则1指定的初始化程序必须调用指定的初始化程序   来自其直接的超类。

     

规则2便捷初始化程序必须从中调用另一个初始化程序   同一个班级。

     

规则3便利初始化程序必须最终调用指定的   初始化程序。

答案 1 :(得分:1)

swift3工作: @Andrea 评论

  

尝试更改super.init()

中的self.init()

答案 2 :(得分:0)

另一种解决方法是为UIView

的frame参数提供默认参数
override init(frame: CGRect = CGRectZero) {
     super.init(frame: frame)
     // custom code
}