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