首页 > 解决方案 > Swift init 方法错误:声明“init(coder:)”不能覆盖多个超类声明

问题描述

我的项目中有许多自定义视图( UIView 的子类)。我需要重写init方法。

我只是想override init(frame: CGRect)方法。而且我不想init?(coder一次又一次地在许多 UIView 子类中编写相同的代码。

required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

并且我给 UIView 添加了一个扩展,然后就OK了。

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 提示首先,

“必需”初始化程序“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:)' 不能覆盖多个超类声明


如何解决?

标签: iosswiftuikit

解决方案


因为convenience initrequired init矛盾。初始化器的实现不能超过一个。


推荐阅读