我爱编程

OC C Swift 文件的相互调用

2017-07-27  本文已影响215人  developer_cp3

首先来看 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一样,可以在方法中做操作。

代码地址

上一篇下一篇

猜你喜欢

热点阅读