OC与Swift混编

    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在我目前使用的范围内并没有什么影响,当然个人涉及范围有限,可能有什么未知的影响还没触及,感兴趣可以尝试,欢迎补充~_~)

配置如下:

OC与Swift混编_第1张图片
实验配置如图

2)在OC中创建swift文件 生成桥接文件和隐藏文件:

    target-->buildSetting--(输入swift)

OC与Swift混编_第2张图片
查看文件名

如图,可以看到生成的文件名:

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 (也可不设置,默认是系统的)


moduleName


2)在OC中首次创建swift或者在swift中首次创建OC,弹出提示,是否创建桥接文件

OC与Swift混编_第3张图片
提示是否创建桥接文件

点击确定,则会生成两个文件:

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文件,然后添加需要的延展,如下图:

OC与Swift混编_第4张图片
UIColor的延展
swift方法中方法的调用


3)创建的swift类,必须继承自NSObject或者NSObject的派生类,否则编译后不会生成对应的转换类,接下来验证一下(此处感谢  @小杰杰杰提示)

a.首先创建一个Person类,不继承NSObject

OC与Swift混编_第5张图片
未继承NSObject的Person类


在OC中TestViewController.m中使用,记得引入"工程名-swift.h",出现如下图的提示,此处按住"command"键,点击Person,进入到刚刚创建的Person类(见上图)

OC与Swift混编_第6张图片
OC中使用未继承NSObject的Person类(swift编写)


b.现在修改原来的Person类,继承NSObject,如下图,修改后要"command+B"编译一下才能看到变化

OC与Swift混编_第7张图片
继承NSObject的Person类


同样在OC中TestViewController.m中使用,记得引入"工程名-swift.h",未报错,如下图:

OC与Swift混编_第8张图片
OC中使用继承NSObject的Person类(swift编写)


此时,按住"command",点击Person进入,此处有惊喜,如下图:

OC与Swift混编_第9张图片

swift编写的Person类对应的转换类.可以互相调用,玄机就在这里❗️

4)创建的swift类中,写了一个枚举,不继承NSObject,此时定义一个该枚举类型的变量,发现桥接文件中没有生成相应的属性,解决办法:定义枚举时需要手动添加添加@objc,如下:

OC与Swift混编_第10张图片
swift中定义枚举类型的变量


看来使用OC与swift混编还是有点限制的,使用时需谨慎,不过,这些也已经够平时使用了


小结:swift和OC混用,坑还是很多的,埋坑是个体力活,常运动是个好习惯...

以上仅是个人使用总结,欢迎批评指正补充~~~~~~~

你可能感兴趣的:(OC与Swift混编)