以下代码显示了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 release notes中提到的init方法创建协议有一种可能的解决方法。我无法同时使用init
和init(frame: CGRect)
初始值设定项。
如何解决这些构建错误?
答案 0 :(得分:17)
子类的指定初始值设定项需要调用Superclass的指定初始值设定项。便捷初始化器只能调用另一个便利初始化器或该类的指定初始化器。
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)
}
规则1指定的初始化程序必须调用指定的初始化程序 来自其直接的超类。
规则2便捷初始化程序必须从中调用另一个初始化程序 同一个班级。
规则3便利初始化程序必须最终调用指定的 初始化程序。
答案 1 :(得分:1)
swift3工作:
@Andrea 评论
尝试更改
中的super.init()
self.init()
答案 2 :(得分:0)
另一种解决方法是为UIView
的frame参数提供默认参数override init(frame: CGRect = CGRectZero) {
super.init(frame: frame)
// custom code
}