Swift init 方法错误:声明 'init(coder:)' 不能覆盖多个超类声明

Posted

技术标签:

【中文标题】Swift init 方法错误:声明 \'init(coder:)\' 不能覆盖多个超类声明【英文标题】:Swift init method error: Declaration 'init(coder:)' cannot override more than one superclass declarationSwift init 方法错误:声明 'init(coder:)' 不能覆盖多个超类声明 【发布时间】:2019-08-26 10:16:28 【问题描述】:

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

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

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

'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:)' 不能覆盖多个超类声明


如何解决?

【问题讨论】:

这是不可能的。这是一个必需的初始化程序。当您覆盖不同的初始化程序时,您必须在任何地方编写它。 【参考方案1】:

您可以从作为 UITableView 子类的 BaseTableView 类继承您的 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)
    

然后你的自定义类是从 BaseTableView 类继承的,有一个方便的重写方法 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)
    

我们使用便利覆盖初始化来传达这是一个便利初始化,它与超类中的指定初始化程序具有相同的签名。

【讨论】:

【参考方案2】:

因为convenience initrequired init 发生冲突。初始化器的实现不能超过一个。

【讨论】:

以上是关于Swift init 方法错误:声明 'init(coder:)' 不能覆盖多个超类声明的主要内容,如果未能解决你的问题,请参考以下文章

Swift 子类化 - 如何覆盖 Init()

Swift 语法错误和 init()?

swift中构造方法和Kvc

Swift:错误:'必需'初始化程序'init(coder :)'必须由'UIView'的子类提供

Swift编码总结4

swift 属性未在 super.init 调用中初始化