我的项目中有很多自定义View(UIView的子类)。而且我需要重写init
方法。
我只想使用override init(frame: CGRect)
方法。而且我不想一次又一次地在许多UIView子类中编写相同的代码init?(coder
。
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
然后我向UIView添加扩展名,然后确定。
extension UIView{
convenience init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当我自定义UITableView类时,会发生问题。
class Table: UITableView {
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
}
Xcode首先提示
'required'初始化程序'init(coder :)'必须由'UITableView'的子类提供
class Table: UITableView {
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
第二个Xcode提示
声明'init(coder :)'不能覆盖多个超类声明
如何解决?
答案 0 :(得分:0)
因为convenience init
和required init
冲突。初始化程序的实现不能超过一个。
答案 1 :(得分:0)
您可以从BaseTableView类(它是UITableView的子类)继承CustomTableView类。 BaseTableView类将同时包含UITableView的初始化方法。例如:
class BaseTableView: UITableView {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
}
}
然后,您的自定义类使用便利的init(frame:...
class Table1: BaseTableView {
convenience override init(frame: CGRect, style: UITableView.Style) {
self.init(frame: frame, style: style)
}
}
class Table2: BaseTableView {
convenience override init(frame: CGRect, style: UITableView.Style) {
self.init(frame: frame, style: style)
}
}
我们使用便捷性覆盖init来传达这是一个便捷性init,它具有与超类中指定的初始化程序相同的签名。