OC C Swift 文件的相互調用

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

代碼地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 讀書多了,知識多了,就要記筆記,否則記不住。抄錄、寫感悟都是筆記,可是寫完了,就扔到那里,永久的拋棄,再也不會去翻...
    蝸牛up666閱讀 325評論 0 1
  • 丙申年九月二十三日,吾步于學堂道中,遇雨傾盆。布衣茫履,皆遭浸濕之禍;同行之人,盡顯狼狽之態。吾獨不覺,倚闌而聽,...
    朱老師語文工作室閱讀 673評論 1 1