Swift和Objective-C混编的那些坑

如何混编不用多说,苹果对Swift 3.0以上的混编辅助已经做得很方便了——无非是build settings中设置标志,以及两个文件,一个是系统或自己创建的bridge文件,用于Swift文件调用OC类导入头文件的桥接;一个是系统生成的xx-swift.h文件,这个连导入都不需要做,直接引用即可。

Swift的以Object为基类的集合类型在传递时可能全部被深拷贝,而OC以NSObject为基类的传递都是默认指针传递。

Swift文件调用OC类的属性时不会编译成可选类型,因此当该OC类的属性为空时,而编译器并不会给出提示,于是运行时Swift代码取值时会崩溃。所以一定要关注调用的OC属性是否可能为nil,并相应做判空处理。

混编后的App如果产生Swift文件内的崩溃,在Bugly上无法生成有效的堆栈,可能会定位到具体的Swift函数,但行数不确定。

个人认为向Swift演进的最大障碍是:由于两种语言混编,并且Swift的ABI不稳定,所以为了兼容所有系统,包括Swift还没有发明时的iOS 7,App打包时会把Swift运行时库全部加入进包中,其中Swift Core, Foundation, Support等动态库有将近30多M,打ipa包时会比纯OC多出10多M;而解压安装到本地后的占用空间更是要多出40,50M。

基本上领导和产品经理们不会放过你的。

更新与更正:经过实践发现,打包成提交App Store的ipa与企业分发的包略有区别,苹果会对Store版本ipa进行合理瘦身,因此这个问题就不再是问题了。夜

你可能感兴趣的:(Swift和Objective-C混编的那些坑)