Swift 分类继承

问题背景

在SDK中有打印日志的公共方法,需要将打印的内容透传给外部APP调用,使APP可以自由拦截日志打印,从而可以根据APP的需要使用日志调试工具。

策略说明

  1. 在swift中,运行时动态调用不支持
  2. 可以使用创建代理,实现代理方法的流程将打印内容代理到外部
  3. 使用分类继承的方法继承日志打印方法(我使用的)

分类继承的实现

  1. 使用分类继承需要创建一个父类,自定义的方法,在分类中不能直接覆盖

    open class TempLogClass {
    static let default = TempLogClass()
    open func logAction(_ message: String, time: String, file: String, level: Int) -> Bool {
    return false
    }
    }

    open override func logAction(_ message: String, time: String, file: String, level: Int) -> Bool {
    MBProgressHUD.log("\(time): \(file)-->\(message)")
    return true
    }

提示:Method does not override any method from its superclass

  1. 在父类中创建打印方法,子类分类中继承

    open class SuperLog {
    @available(iOS 13.0.0, *)
    @objc dynamic open func logAction(_ message: String, time: String, file: String, level: Int) -> Bool {
    return false
    }
    }

    open class TempLogClass: SuperLog {
    static let default = TempLogClass()

    }

    extension TempLogClass {
    @available(iOS 13.0.0, *)
    @objc dynamic open override func logAction(_ message: String, time: String, file: String, level: Int) -> Bool {
    MBProgressHUD.log("\(time): \(file)-->\(message)")
    return true
    }
    }

动态派发机制 需要@objc dynamic

入口+动态派发机制

这时调用DKTempLogClass.default.dklogAction("\(message)", time: time, file: fileName, level: 0)

就会执行分类中的方法。

相关推荐
lichao89042724 分钟前
谈谈未来iOS越狱或巨魔是否会消失
ios
Magnum Lehar25 分钟前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
Mcworld85740 分钟前
java集合
java·开发语言·windows
成功人chen某41 分钟前
配置VScodePython环境Python was not found;
开发语言·python
海绵宝宝贾克斯儿2 小时前
C++中如何实现一个单例模式?
开发语言·c++·单例模式
史迪仔01122 小时前
[python] Python单例模式:__new__与线程安全解析
开发语言·python·单例模式
isyangli_blog2 小时前
(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类
java·开发语言
三块钱07942 小时前
【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案
开发语言·python·音视频
易只轻松熊2 小时前
C++(20): 文件输入输出库 —— <fstream>
开发语言·c++·算法
芯眼2 小时前
ALIENTEK精英STM32F103开发板 实验0测试程序详解
开发语言·c++·stm32·单片机·嵌入式硬件·社交电子