美文网首页我爱编程
OC C Swift 文件的相互调用

OC C Swift 文件的相互调用

作者: developer_cp3 | 来源:发表于2017-07-27 15:39 被阅读215次

    首先来看 swift 调用 oc 的代码,通过一个桥接文件就好了,直接看代码和打印吧:

    先看下我的目录结构,Swift 工程,有oc文件,有c文件,还有桥接自动生成的桥接文件.(最后我会附上项目代码)

    swift调用OC

    需要在桥接文件中 导入oc的头文件

    #include "OCClass.h"

    然后在Swift 文件中就可以直接访问oc的类,调用oc的方法了

    //swift 调用OC

    let s : OCClass = OCClass()

    s.testOcFunc()

    - (void)testOcFunc{

             NSLog(@"这是swift 调用oc的打印");

    }

    OC调用swift

    在OC的头文件引入一个隐式的头文件,文件的组成由项目名加上短横线-再加上Swift.h

    #import "xxx-Swift.h"

    然后oc就可以直接调用Swift的类和方法了

    //oc 调用Swift

    ViewController *v = [[ViewController alloc]init];

    [v ocUSwift];

    func ocUSwift(){

            print("这是oc调用swift的打印");

    }

    Swift 调用C

    创建C文件的时候,会自动生成一个同名的.h文件,如CFile.h/CFile.c

    这两个文件是相关联的。此时我们需要在桥接文件中引入c文件的头文件

    #import "CFile.h"

    swift 调用C方法的时候,是先找CFile.h ,然后CFile.h 再找.c文件,所以要先在.h文件定义 方法,.c实现方法

    void testSwiftUC(){

            printf("这是Swift 调用c的打印\n");

    }

    最后一步就是Swift中调用C方法了

    //swift 调用c

    testSwiftUC()

    C调用Swift

    这个相对麻烦点,参考一篇文章,这是链接:C调用Swift 方法

    简单说来,Swift 和C都识别block,所以我们将方法转化为block,就可以调用了。

    第一步:在CFile.h中申明一个 block

    extern void (^ __nonnull SwiftFunc)(void);

    第二步:先把 SwiftFunc 设置成NULL

    void (^SwiftFunc)(void) = NULL;

    第三步:调用C方法(c方法再调用Swift方法)之前,将这个block指向一个Swift方法

    SwiftFunc = cUSwift

    private func cUSwift(){

         print("这是c调用swift的打印");

    }

    第四步:调用c方法,c方法的实现中就是调用这个block,也就是调用了swift的方法

    testCUSwift()

    void testCUSwift(){

            SwiftFunc();

    }

    OC调用C

    这个与上面Swift调用C方法一样,CFile的h文件中申明方法,C文件中实现,OC里面调用

    //oc 调用C

    testOCUC();

    C调用OC

    当我们需要访问一个OC的类的时候,我暂时还不知道怎么直接在C中初始化OC的类,不过我们可以用直接调用方法达到这一目的。

    首先我们需要在OC文件中申明定义一个C的方法:

    .h文件中申明

    void CFunc();

    .m文件中实现

    void CFunc(){

            selfclass = [[OCClass alloc]initWithName:@"123"];

            [selfclass testPrint];

    }

     而selfclass 是本类的引用

    static OCClass *selfclass ;

    可以在init方法中

    selfclass = self; 

    也可以这样 

    selfclass = [[OCClass alloc]initWithName:@"123"];

    调用的时候,在OC类中模拟c调用OC的方法,先调起C方法

    void testCUOC(){

         CFunc();

    }

    C方法的实现就调用了OC的方法,这个方法中,我们可以生产类,也可以调用类、对象方法

    void CFunc(){

          selfclass = [[OCClass alloc]initWithName:@"123"];

          [selfclass testPrint];

    }

    至此 OC、Swift、C的相互调用就结束了,注意因为是混合编译,所以编译方式需要改下,不然会报错

    其中C调用Swift想访问Swift的类的时候,也是跟C调用OC一样,可以在方法中做操作。

    代码地址

    相关文章

      网友评论

        本文标题:OC C Swift 文件的相互调用

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