swift - 尝试覆盖 Xcode 6.3 Beta 3 中的初始值设定项时出现构建错误

标签 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")
  }
}

错误信息

initializer does not override a designated initializer from its superclass

解决方法?

有一种可能的解决方法,即使用 Beta 3 release notes 中提到的 init 方法创建协议(protocol)。 .我无法让它同时工作 initinit(frame: CGRect) 初始化程序。

如何修复这些构建错误?

最佳答案

子类的指定构造器需要调用父类(super class)的指定构造器。便利构造器只能调用另一个便利构造器或该类的指定构造器。

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

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

编辑:显然在 Beta 3 中,UIView 没有名为 init 的便利初始化器,因此您也需要删除 override 关键字,现在这是一个指定的初始化器,因此您需要调用父类(super class)的指定初始化器

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

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

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

来源:Swift documentation

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

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

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

关于swift - 尝试覆盖 Xcode 6.3 Beta 3 中的初始值设定项时出现构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068534/

相关文章:

xcode - 更新到 Xcode 6.3 后通过 Parse 错误登录 Facebook

ios - XCode 6.3 Alamofire.swift 文件崩溃

swift - 如何在mainViewController中使用pushViewController页面转换

ios - sprite Kit 保存最高分

Swift 自定义数据推送通知

ios - 单击段控制表单元格内的按钮后无法执行 segue

ios - Xcode 6.3.1 错误 : Timed out waiting to acquire lock file for module 'X' where 'X' is my framework

ios - 无法下标 [AnyObject] 的值?具有 Int 类型的索引

ios - Google Analytics SDK 在 Xcode 6.3 中产生问题

swift - 下载自定义 CoreML 模型并加载以供使用 [Swift]