Swift&Objective-C混編互調(diào)

Swift開發(fā)是一種大趨勢了浇揩,每年Apple都會發(fā)布新的版本台妆。但是它的第三方庫還是沒有Objective-C的多扶叉,而且想用老項(xiàng)目中的工具類或框架,該怎么辦呢逼裆?

這就需要Swift&Objective-C混編互調(diào)了郁稍,但是在Objective-C的編譯器主要可以識別以下幾種擴(kuò)展名的文件:

  • .m文件,可以編寫Objective-C代碼或者C語言代碼胜宇;
  • .cpp文件耀怜,C++文件恢着,只能識別C++或者C語言代碼;
  • .mm财破,主要用于編寫C++和Objective-C混編的代碼掰派,可以同時(shí)識別Objective-C、C和C++代碼左痢。

那么該怎么讓Swift&Objective-C混編互調(diào)呢靡羡?在Apple發(fā)布Swift的時(shí)候已經(jīng)提供了方案,在iOS8以后Apple給出了這兩種語言之間的橋接方案俊性,簡單來說就是在Swift工程中略步,通過提示創(chuàng)建的Bridging頭文件可以將Objective-C文件和Swift文件銜接在一起,從而可以在Objective-C文件中引用Swift類定页,或者在Swift文件中引用Objective-C的類趟薄。

下面我們一起來具體操作一下:

1. 創(chuàng)建一個(gè)Swift工程,選擇Single View App
2. 先新建一個(gè)swift類

新建類SwiftObjct.swift典徊,包含一個(gè)屬性杭煎,一個(gè)實(shí)例方法,一個(gè)類方法:

import UIKit

class SwiftObjct: NSObject
{
    var name = "swiftObject"
    
    func instanceMethod( ) -> Void
    {
        print("swift instance method")
    }
    
    class func classMethod( ) -> Void
    {
        print("swift class method")
    }
}
3. 創(chuàng)建第一個(gè)OC類時(shí)會提示創(chuàng)建一個(gè)bridging header文件

會自動(dòng)生成一個(gè)頭文件 SwiftObjectiveC-Bridging-Header.h(前綴是工程名)

再創(chuàng)建一個(gè)Objective-C類OCObject卒落,同樣包含一個(gè)屬性羡铲,一個(gè)實(shí)例方法,一個(gè)類方法:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface OCObject : NSObject

@property (nonatomic,strong) NSString *name;

-(void)instanceMethod;

+(void)classMethod;

@end

NS_ASSUME_NONNULL_END
4. Swift類調(diào)用Objective-C的類

在工程自動(dòng)生成的類ViewController.swift中調(diào)用我們剛創(chuàng)建的Objective-C的類OCObject

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let ocObject = OCObject();
        ocObject.instanceMethod()
        OCObject.classMethod()   
    }
}

此時(shí)編譯器會報(bào)錯(cuò)Use of unresolved identifier 'OCObject'儡毕,原因是我們還沒有把Objective-C的類和Swift關(guān)聯(lián)起來也切。在創(chuàng)建第一個(gè)Objective-C類OCObject的時(shí)候生成的頭文件SwiftObjectiveC-Bridging-Header.h,就是連接它們的橋梁妥曲。

在頭文件中導(dǎo)入剛創(chuàng)建的Objective-C類OCObject:


#import "OCObject.h"

然后一定要command+B編譯通過一下贾费,此時(shí)ViewController.swift調(diào)用的OCObject就不再報(bào)錯(cuò)了。

5. Objective-C類調(diào)用Swift類

上一步建立的連接之后檐盟,接下來我們在OCObject.m實(shí)現(xiàn)它的兩個(gè)方法褂萧,并調(diào)用SwiftObjct:

-(void)instanceMethod
{
    SwiftObjct *swiftObject = [[SwiftObjct alloc] init];
    [swiftObject instanceMethod];
    NSLog(@"oc instance method, swiftObjct.name=%@", swiftObject.name);
}

+(void)classMethod
{
    [SwiftObjct classMethod];
    NSLog(@"oc class method");
}

此時(shí)還會報(bào)錯(cuò)Use of undeclared identifier 'SwiftObjct',這個(gè)地方就還需要導(dǎo)入一個(gè)新的文件:

// 名字前綴是工程名
#import "SwiftObjectiveC-Swift.h"

你會發(fā)現(xiàn)葵萎,在工程中搜不到此頭文件导犹,這是因?yàn)檫@個(gè)類時(shí)隱藏的,工程自動(dòng)生成的羡忘,它的作用就是對工程中所有swift類文件進(jìn)行了向Objective-C語言的翻譯谎痢。所以導(dǎo)入這個(gè)頭文件之后,上面的代碼就不會報(bào)剛才的錯(cuò)了卷雕。但是又報(bào)新的錯(cuò)誤了节猿,SwiftObjct類是識別了,但是不識別它的方法和屬性:

這是因?yàn)镾wift4.0以后,暴露給Objective-C類調(diào)用的swift方法和屬性都要在前面加上修飾詞:@objc滨嘱,否則Objective-C類無法找到對應(yīng)的Swift方法和屬性峰鄙。另外需要注意定義后一定要command+B編譯通過一下工程,才能正常在Objective-C文件中調(diào)用swift屬性和方法太雨。

所以對SwiftObjct.swift修改如下:

import UIKit

class SwiftObjct: NSObject
{
    @objc var name = "swiftObject"
    
    @objc func instanceMethod( ) -> Void
    {
        print("swift instance method")
    }
    
    @objc class func classMethod( ) -> Void
    {
        print("swift class method")
    }
}

然后command+B編譯過后吟榴,報(bào)錯(cuò)都沒有了,并正常打幽野狻:

swift instance method
2019-08-12 18:06:09.617260+0800 SwiftObjectiveC[19281:400024] oc instance method, swiftObjct.name=swiftObject
swift class method
2019-08-12 18:06:09.617474+0800 SwiftObjectiveC[19281:400024] oc class method
注意:

1吩翻、Swift類中不需要import頭文件,因?yàn)樗鼈兊淖饔糜蚴侨值模?br> 2锥咸、SwiftObjectiveC-Swift.h文件是隱藏的狭瞎,它對工程中所有swift類文件進(jìn)行了向Objective-C語言的翻譯;
3搏予、修改Swift類后一定要command+B編譯通過一下脚作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缔刹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劣针,老刑警劉巖校镐,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捺典,居然都是意外死亡鸟廓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門襟己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來引谜,“玉大人,你說我怎么就攤上這事擎浴≡毖剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵贮预,是天一觀的道長贝室。 經(jīng)常有香客問我,道長仿吞,這世上最難降的妖魔是什么滑频? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮唤冈,結(jié)果婚禮上峡迷,老公的妹妹穿的比我還像新娘。我一直安慰自己你虹,他們只是感情好绘搞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布彤避。 她就那樣靜靜地躺著,像睡著了一般看杭。 火紅的嫁衣襯著肌膚如雪忠藤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天楼雹,我揣著相機(jī)與錄音模孩,去河邊找鬼。 笑死贮缅,一個(gè)胖子當(dāng)著我的面吹牛榨咐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谴供,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼块茁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桂肌?” 一聲冷哼從身側(cè)響起数焊,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崎场,沒想到半個(gè)月后佩耳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谭跨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃宙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谆扎。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖籍凝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饵蒂,我是刑警寧澤酱讶,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站渊迁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毒租。R本人自食惡果不足惜箱叁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一耕漱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧螟够,春花似錦、人聲如沸若河。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毛俏。三九已至,卻和暖如春焕蹄,著一層夾襖步出監(jiān)牢的瞬間阀溶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工永品, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼎姐。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓饭尝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钥平。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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