OC与Swift混编

作者: _skye | 来源:发表于2016-01-05 21:06 被阅读1836次

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

    moduleName

    2)在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混用,坑还是很多的,埋坑是个体力活,常运动是个好习惯...

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

    相关文章

      网友评论

      • 3727db4452eb:很棒的分享,非常感谢!
        有个问题想请教,我在Swift文件中,定义了一些全局函数、全局常量,在OC中无法正确调用,提示“Use of undeclared identifier 'xxx' ”,请问这个要做哪些配置了?
      • MyMiaBaby:不错
      • f001ca7bd7fd:如果苹果不行了。swift是不是也就不行了。还是我大java使用范围广
        JinHuiZhang:@浮生不二 唉,说你啥好了!有这想法,静下心来学习学习
        小杰杰杰:@锋芒初露谁人挣 不会的,swift现在已是开源项目,借助开源的力量会蓬勃发展的。
      • 小杰杰杰:凡是用Swift写的类,如果不继成自NSObject或NSObject 的派生类,哪么编译后将不会生成对应的转换类。从而使得OC 中找不到相应的声明。
        _skye:@小杰杰杰 棒棒哒:+1:
      • 6c917c9e2bf1:写的不错,值得借鉴
        _skye:@Struggle努力 谢谢,共同进步

      本文标题:OC与Swift混编

      本文链接:https://www.haomeiwen.com/subject/rbilqttx.html