美文网首页
Swift 继承之方法重写

Swift 继承之方法重写

作者: yyggzc521 | 来源:发表于2022-02-21 14:22 被阅读0次

Swift 类继承时,需要方法重写,结果报错 :
Overriding non-@objc declarations from extensions is not supported

父类Base

class Base {
    func show1() { }
}

extension Base {
    func show2() { }
}

子类child
当子类child的extension 重写 父类 Base 中的 show1 方法 或者 重写父类extension中的show2方法时,就会报上面的错误!

class child: Base {
    override func show2() { }
}

extension child {
    override func show1() { }
}

正确写法

  1. 父类主体方法加上 @objc dynamic 子类的extension 就可以重写了。
  2. 父类extension方法加 @objc 子类的主体就可以重写了
class Base {
    @objc dynamic func show1() { }
}

extension Base {
    @objc func show2() { }
}

class child: Base {
    override func show2() { }  
}

extension child {
    override func show1() { }
}

why?

Swift的方法调度分为 三种

  • 直接调度
  • 表调度
  • 消息调度
  1. 直接调度:直接调用方法声明,速度最快。但是不能动态的支持子类
  2. 表调度:一般用函数地址的数组来储存类中方法的声明,子类中Vtable 会添加父类的方法声明
  3. 消息调度:OC语言就是采用这种方法调度的。通过msg_send() 方法来从类或者父类中查询方法。这个调度比较慢,但有缓存机制,可以提升效率,具有很好的灵活性。
Swift对应调度表

extension 中的方法默认是直接调度,直接调度是不能被继承的。
表调度只能被子类主体继承。

那么如果要实现开头的方法重写 只有让方法是消息调度。
通过 在主体方法 加 @objc dynamic 关键字 和 extension 方法中添加 @objc,来改变方法的调度为消息调度。


参考文章

相关文章

  • Swift 继承之方法重写

    Swift 类继承时,需要方法重写,结果报错 :Overriding non-@objc declarations...

  • Swift 5.x - 初始化(中文文档)

    引言 继续学习Swift文档,从上一章节:继承,我们学习了Swift继承相关的内容,如继承的作用、重写父类的方法和...

  • Swift 5.1 (13) - 继承

    继承 继承是一种基本行为:子类继承父类方法,属性和其他特性。子类可以重写父类的方法,属性。继承将类与Swift中的...

  • Swift笔记<十四>三大特性

    和object-c一样swift的三大特性同为封装,继承,多态 封装 继承 重写方法 重载方法参数名相同,参数个数...

  • 自定义布局

    从 Panel 继承 重写 MeasureOverride 方法重写 ArrangeOverride 方法

  • 类继承之方法重写

    类继承之方法重写: 方法重写 含义 : 如果你的父类方法的功能不能满足子类的需求,可以在子类重写你父类的方法 例子...

  • Swift 继承重写extension方法

    今天在继承重写extension的一个方法时报错 谷歌了一圈发现没解决,和我的情况有点不一样 伪代码如下 当B继承...

  • swift - 自定义view

    继承自uiview 重写初始化方法 重写布局方法

  • allure-08-重要性管理

    一、测试用例分类标识之severity 二、标记方式: 可继承,方法继承类 可重写,方法自身标签优先,没有再用类标...

  • Swift11 - 构造过程/可选链式调用

    类 基类-不继承其他类的类Swift 中的类并不是从一个通用的基类继承而来的重写 - 子类可以为继承来的实例方法,...

网友评论

      本文标题:Swift 继承之方法重写

      本文链接:https://www.haomeiwen.com/subject/oqfilrtx.html