swift强势来袭,想要紧跟脚步,但之前OC的工程推倒重来在时间和实践上都有点伤神,混编就是这个过渡的桥梁,使用混编,快速完成
在OC工程中首次创建swift文件或者swift中首次创建OC文件,都会给出提示是否自动生成一个桥接文件,其实自动生成是两个文件,一个可见一个不可见,但是这两个文件的名称都能在配置文件中找到,在使用之前先看个小实验......
1.使用前需要了解的配置
做个小实验(只用静静看着就好了):
1).target-->buildSetting--(输入packaging)
a.前提条件:工程名字是TimingUsingPickerView
b.Product Module Name 设置成 "imooc"
c.Product Name设置成"imooc1"
d.Defines Module 系统默认是No,此处还是用系统默认的 (这个是经过尝试,设置成Yes 或者No在我目前使用的范围内并没有什么影响,当然个人涉及范围有限,可能有什么未知的影响还没触及,感兴趣可以尝试,欢迎补充~_~)
配置如下:
实验配置如图2)在OC中创建swift文件 生成桥接文件和隐藏文件:
target-->buildSetting--(输入swift)
查看文件名如图,可以看到生成的文件名:
a.桥接文件" TimingUsingPickerView-Bridging-Header.h" 可见的,在工程中可查找到该文件(在swift调用OC文件)
b.imooc-Swift.h不可见,但调用时可像查看系统类的方法查看(在OC中调用swift文件)
经实验发现:
a.无论怎么改变,桥接文件的名字都是跟工程名保持一致.但是该文件是可以单独创建,进行配置的.具体操作步骤:创建一个头文件,然后模仿"工程名-Bridging-Header.h"的形式命名,再查找target-->buildSetting--(输入swift),在Bridging Header中进行设置(一般还是建议使用系统自己创建)
b.生成的不可见文件imooc-Swift.h名字是受Product Module Name影响的.该文件不建议自己创建,所以需要自定义的一定在使用之前先设置好Product Module Name.
2.OC与swift文件的真正混用
实验条件可以忽略,但是为了避免不必要的麻烦,建议看了实验结果再往下走:
1)target-->buildSetting--(输入packaging)-->设置Product Module Name (也可不设置,默认是系统的)
moduleName2)在OC中首次创建swift或者在swift中首次创建OC,弹出提示,是否创建桥接文件
提示是否创建桥接文件
点击确定,则会生成两个文件:
TimingUsingPickerView-Bridging-Header.h 以工程名命名的桥接文件,可见
imooc-Swift.h 不可见,在target-->buildSetting--(输入swift)进行查看
3)swift与OC的混用
a.在swift中使用OC的文件
在自动创建的桥接文件TimingUsingPickerView-Bridging-Header.h中,依次导入swift文件中需要使用的类,然后就可以使用了,不过在swift文件中得按swift的规则写了
导入需要的OC文件b.在OC中使用swift的文件
在OC中导入系统自动生成的imooc-swift.h文件(不能直接查找到该文件,但是可以像查看系统类的方法点击进入查看) ,就可以使用创建的swift文件,"...-swift.h"/"...-Swift.h"都可以
导入系统创建的文件3.swift调用OC中的一些坑
OC 中宏定义 如果只是值类型等简单的宏定义,swift也可直接调用,但是如果是比较复杂的方法,swift就只能呵呵了,这个时间建议创建方法可以使用swift中的延展extension
1)swift中简单宏使用如:
OC中简单宏定义 swift中调用简单宏2)swift中不能使用OC中复杂的宏如:
OC中复杂的宏当不能使用的时候,就需要写成方法供swift使用,可以创建一个swift文件,然后添加需要的延展,如下图:
UIColor的延展 swift方法中方法的调用3)创建的swift类,必须继承自NSObject或者NSObject的派生类,否则编译后不会生成对应的转换类,接下来验证一下(此处感谢 @小杰杰杰提示😊)
a.首先创建一个Person类,不继承NSObject
未继承NSObject的Person类在OC中TestViewController.m中使用,记得引入"工程名-swift.h",出现如下图的提示,此处按住"command"键,点击Person,进入到刚刚创建的Person类(见上图)
OC中使用未继承NSObject的Person类(swift编写)b.现在修改原来的Person类,继承NSObject,如下图,修改后要"command+B"编译一下才能看到变化
继承NSObject的Person类同样在OC中TestViewController.m中使用,记得引入"工程名-swift.h",未报错,如下图:
OC中使用继承NSObject的Person类(swift编写)此时,按住"command",点击Person进入,此处有惊喜,如下图:
swift编写的Person类对应的转换类.可以互相调用,玄机就在这里❗️
4)创建的swift类中,写了一个枚举,不继承NSObject,此时定义一个该枚举类型的变量,发现桥接文件中没有生成相应的属性,解决办法:定义枚举时需要手动添加添加@objc,如下:
swift中定义枚举类型的变量看来使用OC与swift混编还是有点限制的,使用时需谨慎,不过,这些也已经够平时使用了
小结:swift和OC混用,坑还是很多的,埋坑是个体力活,常运动是个好习惯...
以上仅是个人使用总结,欢迎批评指正补充~~~~~~~
网友评论
有个问题想请教,我在Swift文件中,定义了一些全局函数、全局常量,在OC中无法正确调用,提示“Use of undeclared identifier 'xxx' ”,请问这个要做哪些配置了?