iOS開發(fā)之OC和swift互相調(diào)用

一亿鲜、OC調(diào)用swift文件

  • 這里創(chuàng)建一個名為Test的OC項目

  • 在OC項目中創(chuàng)建一個swift文件Person.swift允青,會提示是否創(chuàng)建橋接文件遣耍。這個橋接文件是用于swift調(diào)用OC的,可以創(chuàng)建焚辅,若不創(chuàng)建則后續(xù)手動創(chuàng)建也是可以的岸更。

  • 編譯器會為我們自動創(chuàng)建一個隱藏的Test-swift.h文件鸵膏。
    1、只要在OC文件里引入這個文件就可以使用swift文件怎炊。
    2谭企、這個文件名稱默認是:Product Module Name-Swift.h
    3评肆、如果不希望使用默認名稱债查,也可以自定義,在Build Settings中找到Object-C Generated interface Header Name瓜挽,這里可以自定義用于引入的swift頭文件名稱盹廷,一般格式為:Name-Swift.h,若修改了文件名稱久橙,需重新編譯才可以識別到俄占。注意,當工程名稱中有橫線時淆衷,會被自動轉(zhuǎn)換為下劃線缸榄。
    4、xcode會根據(jù)swift代碼生成對應的OC聲明祝拯,寫入到Name-Swift.h文件中甚带,可以點進去查看。

  • 代碼調(diào)用

  • 1佳头、swfit類要暴露給OC調(diào)用鹰贵,這個類必須要繼承自NSObject
    因為OC調(diào)用方法使用的是runtime的消息機制康嘉,類需要有isa指針碉输,但是swift類是沒有的,所以要繼承自NSObject基類亭珍,才會有isa指針敷钾。

  • 2、swift類需要暴露給OC調(diào)用的成員和方法需要用@objc來修飾一下块蚌。
    具體代碼如下:

Person.swift文件代碼:

class Person: NSObject {
    @objc var age : Int = 0
    @objc  init(age: Int) {
        self.age = age
    }
}

如果覺得每個成員和方法都要用@objc來暴露太繁瑣,也可以使用@objcMembers來暴露所有的成員和方法膘格。

@objcMembers class Person: NSObject {
    var age : Int = 0
    init(age: Int) {
        self.age = age
    }
}

OC文件調(diào)用swift代碼:

#import "Test-swift.h"

Person *p = [[Person alloc] initWithAge:10];
NSLog(@"%ld", p.age);
  • 修改暴露的成員名稱峭范、方法名以及類名
    @objc除了可以暴露成員和方法外,還可以修改它們暴露出去的名稱瘪贱,也可以修改暴露出去的類名纱控。

swfit文件代碼

@objc(JJPerson)
@objcMembers class Person: NSObject {
    var age : Int = 0
    init(age: Int) {
        self.age = age
    }
    @objc(JJSay)
    func say() {
        print("hello")
    }
}

OC調(diào)用swift代碼

#import "JJ-swift.h"

JJPerson *p = [[JJPerson alloc] initWithAge:10];
[p JJSay];

OC文件中使用導入的swift第三方庫

導入swift第三方庫時辆毡,會自動創(chuàng)建一個不可見的文件 庫名-Swift.h

例如:
導入IQKeyboardManagerSwift三方庫,會自動生成IQKeyboardManagerSwift-Swift.h文件甜害,在需要使用IQKeyboardManagerSwift庫的OC文件里#import "IQKeyboardManagerSwift-Swift.h"就可以使用它了舶掖。

使用示例:[IQKeyboardManager shared].enable = YES;

二、swift調(diào)用OC

  • 創(chuàng)建橋接文件
    1尔店、一般在OC項目中第一次創(chuàng)建swift文件或者在swift項目中第一次創(chuàng)建OC文件時xcode會彈出詢問我們是否需要創(chuàng)建這個文件眨攘,點擊確定即可自動創(chuàng)建一個。
    2嚣州、默認名稱為工程名-Bridging-Header.h鲫售,我的工程名為Test所以默認為Test-Bridging-Header.h
    3、如果沒有自動創(chuàng)建该肴,那么手動創(chuàng)建一個工程名-Bridging-Header.h文件也是可以的情竹。
    4、如果不想使用默認的名字匀哄,也可以修改名稱秦效,但是要在Build-Setting->Objective-C Bridging Header中將配置修改為想要的文件路徑。

  • 在橋接文件中導入供swfit調(diào)用的OC文件

  • swift文件調(diào)用OC

三涎嚼、思考

  • 1阱州、OC調(diào)用swift方法走的是runtime機制嗎?
    是铸抑!因為swift類繼承自NSObject才能讓OC使用贡耽,所以類也有isa指針,runtime消息機制就是通過isa指針來尋找方法鹊汛。
    OC調(diào)用swift的JJSay方法蒲赂,斷點查看匯編可以看到紅框部分的注釋,有調(diào)用objc_msgSend刁憋,這個就是OC運行時的消息發(fā)送機制滥嘴。
OC調(diào)用swift方法匯編.png
  • 2、swift調(diào)用OC方法走的是runtime機制嗎至耻?
    是若皱!因為OC方法在.m文件里編譯,所以肯定是runtime機制尘颓。
    swift調(diào)用OC的eat方法走触,斷點查看匯編可以看到紅框部分的注釋,有調(diào)用objc_msgSend疤苹,這個就是OC運行時的消息發(fā)送機制互广。
swift調(diào)用OC方法匯編.png
  • 3、swift類繼承了NSObject,并且也用@objc或者@objcMembers暴露了方法惫皱,在swift文件里直接使用這個類的方法是走的runtime機制嗎像樊?
    不會!
    查看匯編可以看到旅敷,調(diào)用方法這里并沒有objc_msgSend生棍。
swift調(diào)用暴露的swift類的方法匯編.png
  • 4、swift文件調(diào)用swift方法希望它使用runtime怎么做呢媳谁?
    在方法前加上dynamic關(guān)鍵字修飾涂滴,如:dynamic func say() {print("hello")}
    查看匯編,可以看到調(diào)用say方法時的注釋有objc_msgSend韩脑。
dynamic修飾方法調(diào)用匯編.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氢妈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子段多,更是在濱河造成了極大的恐慌首量,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件进苍,死亡現(xiàn)場離奇詭異加缘,居然都是意外死亡,警方通過查閱死者的電腦和手機觉啊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門拣宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杠人,你說我怎么就攤上這事勋乾。” “怎么了嗡善?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵辑莫,是天一觀的道長。 經(jīng)常有香客問我罩引,道長各吨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任袁铐,我火速辦了婚禮揭蜒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剔桨。我一直安慰自己屉更,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布洒缀。 她就那樣靜靜地躺著瑰谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上似舵,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音葱峡,去河邊找鬼砚哗。 笑死,一個胖子當著我的面吹牛砰奕,可吹牛的內(nèi)容都是我干的蛛芥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼军援,長吁一口氣:“原來是場噩夢啊……” “哼仅淑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胸哥,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤涯竟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后空厌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庐船,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年嘲更,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐钟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡赋朦,死狀恐怖篓冲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宠哄,我是刑警寧澤壹将,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站琳拨,受9級特大地震影響瞭恰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狱庇,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一惊畏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧密任,春花似錦颜启、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春口猜,著一層夾襖步出監(jiān)牢的瞬間负溪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工济炎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留川抡,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓须尚,卻偏偏與公主長得像崖堤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耐床,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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