18

以下代码显示 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)初始化程序。

如何修复这些构建错误?

4

3 回答 3

18

子类的指定初始化器需要调用超类的指定初始化器。便利构造器只能调用另一个便利构造器或该类的指定构造器。

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 便利构​​造器最终必须调用指定构造器。

于 2015-03-17T23:15:28.723 回答
1

swift3 工作: @Andrea评论

super.init()试着改变self.init()

于 2017-01-19T14:40:25.393 回答
0

另一种解决方法是为 UIView 的 frame 参数提供默认参数

override init(frame: CGRect = CGRectZero) {
     super.init(frame: frame)
     // custom code
}
于 2015-04-10T00:50:08.020 回答