尝试覆盖 Xcode 6.3 Beta 3 中的初始值设定项时出现构建错误
Build error when trying to override an initializer in Xcode 6.3 Beta 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 方法创建协议。我无法让它同时工作 init
和 init(frame: CGRect)
初始值设定项。
如何修复这些构建错误?
subclass的指定构造器需要调用Superclass的指定构造器。便利构造器只能调用另一个便利构造器或那个 class 的指定构造器。
init() 是 UIView 的便利初始化器,如果你 subclass UIView 你应该调用它指定的初始化器,它是 init(frame: frame)
override init() {
super.init(frame: frame)
// Some init logic ...
}
编辑:显然在 Beta 3 中,UIView 没有名为 init 的便利初始化器,因此您也需要删除 override 关键字,现在这是一个指定的初始化器,因此您需要调用 superclass的指定初始化程序
init() {
super.init(frame: frame)
// Some init logic ...
}
编辑:虽然这可行,但我认为更好的写法是:
convenience init() {
self.init(frame:CGRectZero)
}
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.
另一种解决方法是为 UIView 的框架参数提供默认参数
override init(frame: CGRect = CGRectZero) {
super.init(frame: frame)
// custom code
}
swift3 工作:
@Andrea 评论
try to change super.init()
in self.init()
以下代码显示 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 方法创建协议。我无法让它同时工作 init
和 init(frame: CGRect)
初始值设定项。
如何修复这些构建错误?
subclass的指定构造器需要调用Superclass的指定构造器。便利构造器只能调用另一个便利构造器或那个 class 的指定构造器。
init() 是 UIView 的便利初始化器,如果你 subclass UIView 你应该调用它指定的初始化器,它是 init(frame: frame)
override init() {
super.init(frame: frame)
// Some init logic ...
}
编辑:显然在 Beta 3 中,UIView 没有名为 init 的便利初始化器,因此您也需要删除 override 关键字,现在这是一个指定的初始化器,因此您需要调用 superclass的指定初始化程序
init() {
super.init(frame: frame)
// Some init logic ...
}
编辑:虽然这可行,但我认为更好的写法是:
convenience init() {
self.init(frame:CGRectZero)
}
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.
另一种解决方法是为 UIView 的框架参数提供默认参数
override init(frame: CGRect = CGRectZero) {
super.init(frame: frame)
// custom code
}
swift3 工作:
@Andrea 评论
try to change
super.init()
inself.init()