SwiftyLoad 代码 & 原理解析
2018-11-20 本文已影响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方法的实际实现。