Swift初始化方法错误:声明'init(coder :)'无法覆盖多个超类声明

时间:2019-08-26 10:16:28

标签: ios swift uikit

我的项目中有很多自定义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 :)'不能覆盖多个超类声明


如何解决?

2 个答案:

答案 0 :(得分:0)

因为convenience initrequired 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,它具有与超类中指定的初始化程序相同的签名。