一尘不染

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

swift

以下代码显示了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发行说明中
提到的init方法创建协议。我不能让它工作都都initinit(frame: CGRect)初始化。

我该如何解决这些构建错误?


阅读 192

收藏
2020-07-07

共1个答案

一尘不染

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

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文档

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

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

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

2020-07-07