iOS (OC與Swift)混編之各種填坑勃痴,(實戰(zhàn)demo贈送)

iOS混編,大概意思是Objective-C(后面簡稱OC)工程里面會用到用Swift寫的代碼文件热康,或者是Swift工程里面用到用OC寫的代碼文件沛申;大概分為以下幾種情況

  • OC工程直接拖入使用.swift文件
  • OC工程pod 引入Swift第三方庫文件
  • Swift工程里面直接拖入使用OC,.h/.m文件
  • Swfit工程里面pod 引入OC第三方庫文件

OC工程直接拖入使用.swift文件

先給結論:

一 需要把swift文件里面的struct,改為類姐军,并且繼承自NSObject
二 在類文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚舉類型铁材,能轉為OC代碼的前提是:

  • 1.加@objc尖淘,同上面;
  • 2.枚舉的原始值類型是Int型著觉,并且不能有相關值村生,因為OC里面的枚舉只有Int類型,而且沒有相關值的概念饼丘。
  • 3.swift里面枚舉類型不能為可選型趁桃,因為OC里面的枚舉不可以為空

第一步
在OC工程,當拖入第 一swift文件肄鸽,或者新建第一個swift文件時卫病,會彈出一個創(chuàng)建橋接頭文件的窗口,這個需要選擇“create Briging Header”,后面我們會用這個頭文件

image.png

橋接文件的格式 “XXX-Bridging-Header.h”,其中“XXX”是工程的名稱典徘,如下圖所示


image.png

第二步

image.png

如上圖所示蟀苛,先來看一下我們的swift文件,里面是一個結構體Person烂斋,在OC里面是沒有結構體屹逛,只有類的概念础废,所以正常swift里面的結構體是不能自動轉為OC里面的類的汛骂,所以應該不會有任何反應的

我們在ViewController里面導入#import "XXX-Swift.h",XXX同樣是工程名稱,如下圖

image.png

編譯评腺,看一下帘瞭,導入一個swift文件后,OC工程會不會報錯蒿讥,幸運的是不會編譯報錯蝶念。這個時候嘗試敲一個Person這個類名,看編譯器會不會給出提示

image.png

結果是沒有任何提示芋绸,也就說明了結構體媒殉,是不能自動轉化為OC相應代碼

那我們能不能嘗試加@objc,讓其能轉化呢? **(加@objc摔敛,是讓swift代碼能自動轉化為OC代碼的主要方法)**

image.png

如上圖所示廷蓉,直接提示,@objc马昙,應該用在類身上桃犬。所以一個小小的結論:Swift里面的結構體是不能轉為OC代碼,也就不能在OC工程里面使用的

第三步
我們把Person 改為類的形式行楞,如下所示攒暇,然后在ViewController里面看有沒有提示

image.png

如上圖,還是沒有任何提示子房;
那我們再加@objc形用,而且根據(jù)提示就轧,Person類要繼承NSObject類,再來看看編譯器會不會給我們提示
image.png

可以看出是可行的田度,Person類已經可以被編譯器自動提示出來了钓丰。
這個時候那些沒有加@objc的屬性和方法還是不能用的,所以我們得去全部加@objc每币;
在加@objc之前携丁,我們先按住“Command”鍵和"OCDemo-Swift.h",跳進去看一下
image.png

里面已經根據(jù)swift里面的代碼兰怠,生成對應的OC代碼了梦鉴,目前只有一個init方法;與上面說法這個時候那些沒有加@objc的屬性和方法還是不能用的;是相符的揭保;

好了肥橙,我們趕緊全部加上@objc,再來看一下秸侣,ViewController界面有沒有提示存筏,同時也再進"OCDemo-Swift.h",里面去看看味榛,會不會生成更多的代碼椭坚;如下所示,確實如我們所想

image.png

如果我們類中的屬性和方法很多怎么辦搏色,也需要這么麻煩一個一個加@objc么善茎,這個時候,我們可以使用一個更高級的關鍵詞@objcMembers,加上它后频轿,就相當于垂涯,所以屬性和方法都加了@objc,如下

image.png

上面已經驗證了結論一航邢,結論二耕赘,現(xiàn)在我們來驗證結論三,swift中的枚舉
我們先在Persion.swift文件里面增加枚舉膳殷,Cmd+B編譯一下操骡,沒有報錯,但此時還沒有加@objc

enum.png

當我們加@objc后秽之,就直接報錯当娱,需要integer類型


image.png

我們就按報錯的提示來進行修改,結果如下


success.png

OC工程pod 引入Swift第三方庫文件

結論跟前面一樣考榨,使用步驟稍有不同:

一 需要把swift文件里面的struct跨细,改為類,并且繼承自NSObject
二 在類文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚舉類型河质,能轉為OC代碼的前提是:

  • 1.加@objc冀惭,同上面震叙;
  • 2.枚舉的原始值類型是Int型,并且不能有相關值散休,因為OC里面的枚舉只有Int類型媒楼,而且沒有相關值的概念。
  • 3.swift里面枚舉類型不能為可選型戚丸,因為OC里面的枚舉不可以為空

我們就拿一個swift庫來做演示Charts,用cocospod的方式安裝到工程里面如下圖所示

image.png

使用步驟:

在橋接文件里面導入Charts模塊@import Charts;(導入過程可能沒有代碼提示)
在使用的地方划址,導入橋接文件#import "OCDemo-Bridging-Header.h",其中OCDemo是項目工程的名稱

image.png

然后就可以看到當敲部分chartView代碼,編譯器就能把各種頭文件提示出來限府,就可以正常使用這個swift庫了

Swift工程里面直接拖入使用OC,.h/.m文件

直接拖入一個Student

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Student : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double score;

-(void)learn;
@end

NS_ASSUME_NONNULL_END
#import "Student.h"

@implementation Student

- (NSString *)name {
    return self.name;
}
- (void)setName:(NSString *)name {
    self.name = name;
}


- (double)score {
    return self.score;
}

- (void)setScore:(double)score {
    self.score = score;
}

- (void)learn {
    NSLog(@"learn");
}
@end
image.png

需要做的夺颤,就是在橋接文件SwiftDemo-Bridging-Header.h里面,導入OC的類

#import "Student.h"
image.png

然后就可以在使用的地方胁勺,用起來

image.png

Swfit工程里面pod 引入OC第三方庫文件

我們先Pod一個純OC庫pod 'SVProgressHUD',
然后步驟同上世澜,先在橋接文件中 導入OC頭文件,然后直接使用OC的類署穗,如下圖所示

image.png

實踐案例

在OC工程里面處理以下幾種情況

  1. OC ViewController里調用自定義OC類
  2. OC ViewController里調用Pod進來OC類
  3. OC ViewController里面調用自定義Swift類
  4. OC ViewController里面調用Pod進來Swift類
  1. Swift ViewController里調用自定義OC類
  2. Swift ViewController里調用Pod進來OC類
  3. Swift ViewController里面調用自定義Swift類
  4. Swift ViewController里面調用Pod進來Swift類

有經驗的小伙伴寥裂,應該會想到為什么有以上的這么種情況,比如:一個OC ViewController 會push到一個Swift ViewController案疲,然后Swift ViewController 又push到下一級OC ViewController封恰;這樣的混編場景是可能遇到的,就會遇到上面的8種情況络拌。只有處理好上面的8種情況俭驮,才算真正意義上實現(xiàn)了混編回溺。

OC文件使用其他文件的導入方式春贸,處理1~4的情況;如下圖


oc文件使用其他文件.png

Swift文件使用其他文件的導入方式遗遵,處理5~8的情況萍恕;如下圖

在橋接文件需要如下的導入方式,這個是重點车要,這個是重點允粤,這個是重點(這個好像其他博主,都沒有提到翼岁。),在這里導入后类垫,其他swift文件就可以直接使用 橋接文件導入OC文件和swift文件

橋接文件導入方式.png

swift文件使用其他文件.png

實戰(zhàn)demo放在某盤,有需要的小伙伴自取吧
鏈接: https://pan.baidu.com/s/18dlFqBsl3iCRzhF0CmGHfw 提取碼: rwtf
Github地址請點擊這里

結尾

今天的分享至此接近尾聲嘍琅坡,小伴們,覺得有點用的話悉患,或者已經看到這里面來的請點贊加關注吧~~ 后續(xù)分享更多iOS原生技術及物聯(lián)網技術相關文章。如果有疑問的話榆俺,歡迎在下方留言~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末售躁,一起剝皮案震驚了整個濱河市坞淮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陪捷,老刑警劉巖回窘,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異市袖,居然都是意外死亡啡直,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門苍碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來付枫,“玉大人,你說我怎么就攤上這事驰怎〔玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵县忌,是天一觀的道長掂榔。 經常有香客問我,道長症杏,這世上最難降的妖魔是什么装获? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮厉颤,結果婚禮上穴豫,老公的妹妹穿的比我還像新娘。我一直安慰自己逼友,他們只是感情好精肃,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帜乞,像睡著了一般司抱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黎烈,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天习柠,我揣著相機與錄音,去河邊找鬼照棋。 笑死资溃,一個胖子當著我的面吹牛,可吹牛的內容都是我干的烈炭。 我是一名探鬼主播溶锭,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梳庆!你這毒婦竟也來了暖途?” 一聲冷哼從身側響起卑惜,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驻售,沒想到半個月后露久,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡欺栗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年毫痕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迟几。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡消请,死狀恐怖,靈堂內的尸體忽然破棺而出类腮,到底是詐尸還是另有隱情臊泰,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布蚜枢,位于F島的核電站缸逃,受9級特大地震影響,放射性物質發(fā)生泄漏厂抽。R本人自食惡果不足惜需频,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筷凤。 院中可真熱鬧昭殉,春花似錦、人聲如沸藐守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗伤。三九已至吃靠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間足淆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工礁阁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巧号,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓姥闭,卻偏偏與公主長得像丹鸿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棚品,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容