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