Swift Runtime分析:还像OC Runtime一样吗?
同样的做法,我们把TestASwiftClass的方法和属性也都加上dynamic修饰,做Method Swizzling,同样获得成功,如图 Objective-C获取Swift runtime信息 在Objective-c代码里使用objc_getClass("TestSwiftVC");会发现返回值为空,这是为什么?Swift代码中的TestSwiftVC类,在OC中还是这个名字吗? 我们初始化一个对象,并断点和打印看看,如下图: 可以看到Swift中的TestSwiftVC类在OC中的类名已经变成TestSwift.TestSwiftVC,即规则为SWIFT_MODULE_NAME.类名称,在普通源码项目里SWIFT_MODULE_NAME即为ProductName,在打好的Cocoa Touch Framework里为则为导出的包名。 所以要想从Objective-c中获取Swift类的runtime信息得这样写: Objective-C替换Swift函数 给TestSwiftVC和TestASwiftClass的testReturnVoidWithaId函数加上dynamic修饰,然后我们在Objective-C代码里替换为testReturnVoidWithaIdImp函数: 运行之后我们得到结果 F:void testReturnVoidWithaIdImp(__strong id, SEL, __strong id) L:20 self=<TestSwift.TestSwiftVC: 0x7fb4e1d148f0> F:void testReturnVoidWithaIdImp(__strong id, SEL, __strong id) L:20 self=TestSwift.TestASwiftClass 说明两者的方法在加上dynamic修饰后,均能在Objective-c里被替换。(TestSwiftVC的testReturnVoidWithaId不加dynamic也会打印日志,为什么?留给读者思考) 总结 纯Swift类没有动态性,但在方法、属性前添加dynamic修饰可以获得动态性。 继承自NSObject的Swift类,其继承自父类的方法具有动态性,其他自定义方法、属性需要加dynamic修饰才可以获得动态性。 若方法的参数、属性类型为Swift特有、无法映射到Objective-C的类型(如Character、Tuple),则此方法、属性无法添加dynamic修饰(会编译错误) Swift类在Objective-C中会有模块前缀 关于本文 本文作者尹峥伟(花名 君展),手机淘宝技术团队的资深无线开发工程师,主要负责手机淘宝基础架构研发,Github开源库Wax的维护者,微博@君展。本文已投稿至InfoQ。 关于阿里百川 阿里百川(baichuan.taobao.com)是阿里巴巴集团“云”+“端”的核心战略是阿里巴巴集团无线开放平台,基于世界级的后端服务和成熟的商业组件,通过“技术、商业及大数据”的开放,为移动创业者提供可快速搭建App、商业化APP并提升用户体验的解决方案;同时提供多元化的创业服务-物理空间、孵化运营、创业投资等,为移动创业者提供全面保障。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |