尝试在Xcode 6.3 Beta 3中覆盖初始化程序时生成错误 [英] Build error when trying to override an initializer in Xcode 6.3 Beta 3

查看:103
本文介绍了尝试在Xcode 6.3 Beta 3中覆盖初始化程序时生成错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码显示了Xcode 6.3 测试版3 中的生成错误.该代码可在Xcode 6.2和Xcode 6.3 Beta 2中使用.

The following code shows build error in Xcode 6.3 Beta 3. The code works in Xcode 6.2 and 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")
  }
}

错误消息

初始化程序不会从其超类中覆盖指定的初始化程序

initializer does not override a designated initializer from its superclass

解决方法?

使用 Beta 3发行说明.我无法使它同时在initinit(frame: CGRect)初始化程序中起作用.

Workaround?

There is a possible workaround of creating a protocol with init methods mentioned in Beta 3 release notes. I could not make it work both both init and init(frame: CGRect) initializers.

如何解决这些构建错误?

How can I fix those build errors?

推荐答案

子类的指定初始值设定项需要调用Superclass的指定初始值设定项.便利初始化程序只能调用该类别的另一个便利初始化程序或指定的初始化程序.

A designated initializer of a subclass needs to call the designated initializer of Superclass. A convenience initializer can only call another convenience initializer or a designated initializer of that class.

init()是UIView的便捷初始化程序,如果您将UIView子类化,则应调用其指定的初始化程序init(frame:frame)

init() is a convenience initializer for UIView, if you subclass UIView you should call its designated initializer which is init(frame: frame)

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

显然在Beta 3中,UIView没有名为init的便捷初始化程序,因此您也需要删除override关键字,因为这是一个指定的初始化程序,所以您需要调用超类的指定的初始化程序

Apparently in Beta 3, UIView doesn't have convenience initializer called as init, so you need to remove the override keyword too, now this is a designated initializer so you need to call superclass's designated initializer

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

虽然这可行,但是我认为写这个更好的方法是:

Although this works but I think a better way to write this would be:

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

来源:快速文档

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

Rule 1 A designated initializer must call a designated initializer from its immediate superclass.

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

Rule 2 A convenience initializer must call another initializer from the same class.

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

Rule 3 A convenience initializer must ultimately call a designated initializer.

这篇关于尝试在Xcode 6.3 Beta 3中覆盖初始化程序时生成错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆