背景
最近在做一个Swift项目,想在项目启动时做一些数据的初始化 ,怎奈Swift并没有OC 中的load和initialize方法,于是上网开扒寻找好解决方案,于是就有了下面的介绍。
实现方式
1、创建一个 OC 对象 NSSwiftLoadProtocol。
2、在NSSwiftLoadProtocol.h文件内定义一个NSSwiftyLoadProtocol的协议,该协议的目的是在swift环境中接受load和initialize的回调。
3、使用宏为每一个需要添加load方法或者initialize方法的Swift类,添加一个category分类,该分类是调用swift环境中extension扩展中实现了协议的swiftyLoad和swiftyInitialize方法的实际实现。
#import <Foundation/Foundation.h>
@protocol NSSwiftLoadProtocol <NSObject>
@optional
+ (void)swiftLoad;
+ (void)swiftInitialize;
@end
#define SWIFTY_LOAD_INITIALIZE(className) \
@interface className(swizzle_swifty_hook)\
@end\
\
@implementation className(swizzle_swifty_hook)\
+ (void)load {if ([[self class] respondsToSelector:@selector(swiftLoad)]) {[[self class] swiftLoad];}}\
+ (void)initialize {if ([[self class] respondsToSelector:@selector(swiftInitialize)]) {[[self class] swiftInitialize];}}\
@end
4、在NSSwiftLoadProtocol.m文件内导入Swift头文件,通过宏创建一个Swift类的分类
#import "SwiftLoadProtocol.h"
//导入swift
#import <jining-Swift.h>
SWIFTY_LOAD_INITIALIZE(MYNetworkConfig)
5、Swift类MYNetworkConfig 遵循协议NSSwiftLoadProtocol 实现协议方法。
extension MYNetworkConfig : NSSwiftLoadProtocol {
public static func swiftLoad() {
initNetworkConfig()
initNetworkHeader()
print("调用 MYNetworkConfig swiftLoad 方法初始化网络数据成功~~~")
}
public static func swiftInitialize() {
print("调用 MYNetworkConfig swiftyInitialize 方法初始化成功~~~")
}
}
6、允许Swift项目打印日志
截屏2022-11-26 下午12.43.48.png
至此功能实现完成 。
文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.
网友评论