[iOS] Swift與Objective-C混編

一. 創(chuàng)建Objective-C混編橋接文件

當(dāng)Swift與OC混編時(shí),需要?jiǎng)?chuàng)建橋接文件,才能在OC中使用Swift, 或者在Swift中使用OC的一些文件,橋接文件的默認(rèn)命名規(guī)則是 fileName-Brigding-Header.h

fileName: 自定義文件名稱
-Brigding-Header.h : 固定寫法
也可以不按此規(guī)則, 根據(jù)自己需求自定義, 沒有影響;

下面就來看看具體的創(chuàng)建步驟:

1.1. 方式一: 自動(dòng)生成

最簡(jiǎn)單的創(chuàng)建方法就是, 在Swift項(xiàng)目中新建一個(gè)OC的文件, 或者在一個(gè)OC的項(xiàng)目中新建一個(gè)Swift文件, Xcode都會(huì)自動(dòng)提示, 是否創(chuàng)建Header, 點(diǎn)擊新建即可;

1.2. 方式二: 手動(dòng)創(chuàng)建

手動(dòng)創(chuàng)建需要兩步:

1.2.1. 創(chuàng)建頭文件

左側(cè)文件列表,右鍵選擇New File... -->選擇Header File

選擇Header File

下一步,起個(gè)文件名稱,這里是: Test-Brigding-Header

Test-Brigding-Header

新建的文件如下:

Test-Brigding-Header.h
1.2.2. 配置路徑

接下來配置橋接文件的路徑:
來到項(xiàng)目的Build Settings,搜索 bridging,回車;
Swift Compiler-General中選擇Objective-C Bridging Header
右側(cè)空白處,雙擊在彈出框中輸入橋接文件的路徑: 文件路徑/文件名稱
這里的橋接文件在HeaderBridgeTest文件夾下,
所以只需輸入:HeaderBridgeTest/Test-Brigding-Header.h

添加橋接文件路徑

編譯,無報(bào)錯(cuò),即添加成功.

PS:如果橋接文件在其他的文件夾下,路徑中要添加上這層文件夾,例如:

這里多了一層文件Test文件夾

這里將橋接文件放在Test文件夾下,路徑中多了一層Test文件夾.

注意:
在添加橋接路徑的時(shí)候,有的人說,可以直接將橋接文件拖拽到彈出框內(nèi),自動(dòng)生成一個(gè)完整路徑,如下:

創(chuàng)建文件.gif

這樣雖然也可以添加,編譯也沒用問題,但是一旦換一臺(tái)電腦,運(yùn)行此項(xiàng)目,肯定會(huì)報(bào)路徑錯(cuò)誤,所以這種方式是不可取的.

二. Swift中使用OC的類庫(kù)

如果在Swift項(xiàng)目使用OC語(yǔ)言的類庫(kù), 只需要把要使用的OC文件的頭文件添加到這個(gè)橋接文件即可,這里添加了MBProgressHUD:

導(dǎo)入頭文件

PS: 如果是使用cocoapods管理的OC的第三方庫(kù), 在引用頭文件的時(shí)候, 要加上外層文件夾路徑, 例如這里的MBProgressHUD如果是使用cocoapods加載, 應(yīng)該這樣在橋接文件引用頭文件:

#import "MBProgressHUD/MBProgressHUD.h"

然后在需要的地方,直接使用即可:

使用HUD

如果在使用時(shí),沒有代碼補(bǔ)全提示,或者強(qiáng)打后,報(bào)錯(cuò),可Clean一下項(xiàng)目,再使用...

三. OC項(xiàng)目中使用Swift文件

如果在OC項(xiàng)目中使用Swift文件, 依然需要添加這個(gè)橋接文件, 但是不在里面引入Swift的頭文件(Swift也沒有頭文件),而是引用:

#import "項(xiàng)目名稱-Swift.h"

這里是默認(rèn)名稱, 如果添加橋接文件后, 沒有做任何更改, 直接這么寫就行, 例如下面這個(gè)項(xiàng)目:

屏幕快照 2017-11-29 下午2.01.10.png

這是一個(gè)OC的項(xiàng)目, 我新建了一個(gè)SwiftPeople.swift文件:

class SwiftPeople: NSObject {

    var name = ""
    var age = 0
    
    
    init(_ name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func isCanWork() {
        if self.age >= 18 {
            print("\(name), 您好!\n恭喜您, 可以參加工作!")
        } else {
            print("\(name), 您好!\n抱歉, 您未滿18歲, 不能參加工作!")
        }
    }
}

注意: 如果想在OC中使用Swift自定義的類, 這個(gè)自定義的類需要繼承自NSObject, 否則是無法使用的.

使用的時(shí)候可以按照下面的方式:

#import "ViewController.h"
#import "Test-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    SwiftPeople *people = [[SwiftPeople alloc]init:@"張三" age:16];
    
    [people isCanWork];
    
    
}
@end

運(yùn)行會(huì)輸出:

張三, 您好!
抱歉, 您未滿18歲, 不能參加工作!

上面是使用的默認(rèn)的文件名稱, 即:

#import "Test-Swift.h"

這個(gè)可以根據(jù)自己的需求修改的:
在 Build Settings 搜索: Product Module Name

Product Module Name

這里是默認(rèn)的 Test, 可以修改為你要的名稱, 例如: MyTest :


使用的時(shí)候就需要引入頭文件:

#import "MyTest-Swift.h"

上面例子可改寫為:

#import "ViewController.h"
#import "MyTest-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    SwiftPeople *people = [[SwiftPeople alloc]init:@"張三" age:16];
    
    [people isCanWork];
    
    
}
@end

(完)

Github LQQZYY
CSDN博客 流火緋瞳
新浪微博 杯水_滄海
QQ 302934443
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辟狈,一起剝皮案震驚了整個(gè)濱河市镶柱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌他膳,老刑警劉巖舱权,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锥余,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門痢掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱犹,“玉大人嘲恍,你說我怎么就攤上這事⌒劬裕” “怎么了佃牛?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)医舆。 經(jīng)常有香客問我俘侠,道長(zhǎng),這世上最難降的妖魔是什么蔬将? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任爷速,我火速辦了婚禮,結(jié)果婚禮上霞怀,老公的妹妹穿的比我還像新娘惫东。我一直安慰自己,他們只是感情好毙石,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布廉沮。 她就那樣靜靜地躺著,像睡著了一般徐矩。 火紅的嫁衣襯著肌膚如雪滞时。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天滤灯,我揣著相機(jī)與錄音漂洋,去河邊找鬼。 笑死力喷,一個(gè)胖子當(dāng)著我的面吹牛刽漂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弟孟,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贝咙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拂募?” 一聲冷哼從身側(cè)響起庭猩,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陈症,沒想到半個(gè)月后蔼水,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录肯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年趴腋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡优炬,死狀恐怖颁井,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蠢护,我是刑警寧澤雅宾,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站葵硕,受9級(jí)特大地震影響眉抬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懈凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一蜀变、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蘸劈,春花似錦、人聲如沸尊沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洼专。三九已至棒掠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屁商,已是汗流浹背烟很。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜡镶,地道東北人雾袱。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像官还,于是被迫代替她去往敵國(guó)和親芹橡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容