【OC/Swift混编】接口中数据类型的建议(三):类型转换底层实现原理

一、前言

本文通过反汇编伪代码+Swift源码+Swift的Foundation源码来分析OC与Swift之间数据类型转换的底层实现,结论如下:

二、OC到Swift类型转换底层实现结论

对于NSStringNSArrayNSDictionary等这类不可变类型的变量,将其转换为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)

对于NSMutableStringNSMutableArrayNSMutableDictionary等可变类型或者其它自定义类型变量,在转换为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]

testDict1testDict3都是将OC的NSDictionary对象转换为Swift中的Dictionary对象,其反汇编后的伪代码类似,以testDict3方法为例,其反汇编后的伪代码如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值