美文网首页
SwiftyLoad 代码 & 原理解析

SwiftyLoad 代码 & 原理解析

作者: 犯色戒的和尚 | 来源:发表于2018-11-20 14:50 被阅读0次

    在开发工程中为了实现一些通用的功能除了继承通用类之外,还可以使用NSObject的load函数,在应用启动时自动监听。这个模块只要被项目包含,就能够发挥作用,不需要在项目里面添加任何代码。并且可以减轻项目的耦合程度。

    但是:Swift3.0版本之后,在swift环境中使用load方法时提示:Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift,也就是load方法已经不在许可在swift中使用。

    在文章Swift环境中Load与Initialize的实现中提到了一个开源库SwiftyLoad
    其核心代码如下

    @protocol NSSwiftyLoadProtocol <NSObject>
    @optional
    + (void)swiftyLoad;
    + (void)swiftyInitialize;
    @end
    #define SWIFTY_LOAD_INITIALIZE(className) \
    @interface className(swizzle_swifty_hook)\
    @end
    
    @implementation className(swizzle_swifty_hook)\
    + (void)load {if ([[self class] respondsToSelector:@selector(swiftyLoad)]) {[[self class] swiftyLoad];}}\
    + (void)initialize {if ([[self class] respondsToSelector:@selector(swiftyInitialize)]) {[[self class] swiftyInitialize];}}\
    @end
    
    SWIFTY_LOAD_INITIALIZE(UIButton)//make UIKit class UIButton enable load() and initialize()
    SWIFTY_LOAD_INITIALIZE(TestObject)//make custom class TestObject enable load() and initialize()
    

    由以上两段代码可以得知
    使用宏 SWIFTY_LOAD_INITIALIZE为每一个需要添加load方法或者initialize方法的类,添加一个category分类,该分类是调用swift环境中extension扩展中实现了协议的swiftyLoad和swiftyInitialize方法的实际实现。

    传送门

    Swift环境中Load与Initialize的实现
    SwiftyLoad

    相关文章

      网友评论

          本文标题:SwiftyLoad 代码 & 原理解析

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