本文目录
一、前言
本文通过反汇编伪代码+Swift源码+Swift的Foundation源码来分析OC与Swift之间数据类型转换的底层实现,结论如下:
二、OC到Swift类型转换底层实现结论
对于NSString
,NSArray
,NSDictionary
等这类不可变类型的变量,将其转换为Swift中相对应的类型时,是调用由Foundation
框架对应数据类型extension中所提供的_unconditionallyBridgeFromObjectiveC
函数。
例如下面的代码:
let ocDict:NSDictionary = NSDictionary.init(dictionary:["strKey":"strValue","boolKey":true,"dictKey":["key":"value"]])
let swDict = ocDict
其本质为:
let ocDict:NSDictionary = NSDictionary.init(dictionary: ["strKey":"strValue","boolKey":true])
let swDict:Dictionary<String,Any> = Dictionary<String,Any>._unconditionallyBridgeFromObjectiveC(ocDict)
对于NSMutableString
,NSMutableArray
,NSMutableDictionary
等可变类型或者其它自定义类型变量,在转换为swift多对应的对象时经历了三个步骤:(以NSMutableDictionary
转换为swift中的Dictionary
为例)
1.调用swift_dynamicCastObjCClassUnconditional
,将NSMutableDictionary
强制转换为NSDictionary
类型。
2.调用_swift_instantiateConcreteTypeFromMangledName
,获取Swift的Dictionary
元类
3.调用Swift._forceBridgeFromObjectiveC_bridgeable
,将NSDictionary
转换为Swift的Dictionary
(本质仍然是调用Foundation
框架中其对应类型的extension
提供的_unconditionallyBridgeFromObjectiveC
方法)
三、Swift到OC类型转换底层实现结论
通过Foundation
框架中其对应类型extension
提供的_bridgeToObjectiveC
方法将swift对象转换为OC对象。
let swDict:[String:Any] = ["strKey":"strValue","boolKey":true,"dictKey":["key":"value"]]
let ocDict:NSDictionary = swDict as NSDictionary
本质
let swDict:[String:Any] = ["strKey":"strValue","boolKey":true,"dictKey":["key":"value"]]
let ocDict:NSDictionary = swDict._bridgeToObjectiveC()
四、工欲善其事,必先利其器
本文分析所用到的工具及源码如下:
反汇编工具:Hopper Disassembler
Swift源码:https://github.com/apple/swift.git
Foundation源码:https://github.com/apple/swift-corelibs-foundation.git
五、分析NSDictionary转换为[String:Any]
testDict1
和testDict3
都是将OC的NSDictionary
对象转换为Swift中的Dictionary
对象,其反汇编后的伪代码类似,以testDict3
方法为例,其反汇编后的伪代码如下: