Using Swift with Cocoa and Objective-C--在同個工程中使用Swift和在同個工程中

Swift與Objective-C的兼容能力允許你在同一個工程中同時使用兩種語言。你可以用這種叫做“mix and match”的特性來開發(fā)基于混合語言的應用。使用Swfit的最新特性--“mix and match”戈擒,你可以實現應用的一部分功能赛惩,并無縫地并入已有的Objective-C的代碼中煌茬。

Swift與Objective-C文件可以在一個工程中并存址否,不管這個工程原本是基于Objective-C還是Swift。你可以直接往現有工程中簡單地添加另一種語言的文件麦锯。這種自然的工作流使得創(chuàng)建混合語言的應用或framework target恕稠,與用單獨一種語言時一樣簡單。

編寫混合語言的工作流程只有一點點區(qū)別扶欣,這取決于你是在寫應用還是寫框架鹅巍。下面描述了用兩種語言在一個target中導入模型的情況,后續(xù)章節(jié)會有更多細節(jié)料祠。

在同一個App Target中進行代碼導入

如果你在寫混合語言的應用昆著,可能需要用Swift代碼訪問Objective-C代碼,或者反之术陶。本章描述的流程適用于non-framework target。

將Objective-C導入Swift

要在同一個app target中導入Objective-C文件供Swift使用煤痕,你需要依賴Objective-C的橋接頭文件(Objective-C bridging header)來暴露給 Swift梧宫。當你添加 Swift 文件到現有的Objective-C應用時,Xcode 會自動創(chuàng)建這些頭文件摆碉,反之亦然塘匣。

如果你同意,Xcode 會在源文件創(chuàng)建的同時生成頭文件巷帝,并用product的模塊名加上 -Bridging-Header.h命名忌卤。關于 product 的模塊名,詳見 Naming Your Product Module楞泼。

你應該編輯這個頭文件來對Swift暴露出Objective-C代碼驰徊。

To import Objective-C code into Swift from the same target

1.在Objective-C橋接頭文件中,導入任何你想暴露給 Swift 的頭文件堕阔,例如:

OBJECTIVE-C


2.在Build Settings中棍厂,確保Objective-C橋接頭文件的build setting是基于 Swfit 編譯器,即Code Generation 含有頭文件的路徑超陆。這個路徑必須是頭文件自身的路徑牺弹,而不是它所在的目錄。

這個路徑應該是你工程的相對路徑,類似 Info.plist 在 Build Settings 中指定的路徑张漂。在大多數情況下晶默,你不需要修改這個設置。

在這個橋接頭文件中列出的所有公開的Objective-C 頭文件都會對 Swift 可見航攒。之后當前 target 的所有 Swift 文件都可以使用這些頭文件中的方法磺陡,不需要任何import語句。用 Swift 語法使用這些Objective-C代碼屎债,就像使用系統自帶的類一樣仅政。

SWIFT


將 Swift 導入Objective-C

向Objective-C中導入Swift代碼時,你依賴 Xcode 生成的頭文件來向Objective-C暴露 Swift 代碼盆驹。這個自動生成Objective-C頭文件圆丹,聲明了target 中所有 Swift 代碼中定義的接口∏可以把這個Objective-C頭文件看作 Swift 代碼的umbrella header辫封。它以 product 模塊名加 -Swift.h 來命名。關于 product 的模塊名廉丽,詳見 Naming Your Product Module倦微。

你不需要做任何事情來生成這個頭文件,只需要將它導入到你的Objective-C代碼來使用它正压。注意這個頭文件中的 Swift 接口包含了它所使用到的所有 Objc 類型欣福。如果你在 Swift 代碼中使用你自己的Objective-C類型,確保先將對應的 Objc 頭文件導入到你的 Swift 代碼中焦履,然后才將 Swift 自動生成的頭文件導入到 Objc .m 源文件中來訪問 Swift 代碼拓劝。

To import Swift code into Objective-C from the same target

在相同 target 的 Objc .m 源文件中,用下面的語法來導入Swift 代碼:

OBJECTIVE-C


target 中任何 Swift 文件將會對 Objc .m 文件可見嘉裤,包括這個 import 語句郑临。關于在 Objc 代碼中使用 Swift 代碼,詳見 Using Swift from Objective-C屑宠。


在同個Framework Target中導入代碼

如果你在寫一個混合語言的框架厢洞,可能會從 Swift 代碼訪問 Objc 代碼,或者反之典奉。

將 Objc 導入 Swift

要將一些 Objc 文件導入到同個框架 target 的 Swift 代碼中去躺翻,你需要將這些文件導入到 Objc 的 ?umbrella header ?來供框架使用。

To import Objective-C code into Swift from the same framework

確保將框架 target 的 ?Build Settings > Packaging > Defines Module ?設置為 ?Yes 卫玖。然后在你的 ?umbrella header ?頭文件中導入你想暴露給 Swift 訪問的 Objc 頭文件获枝,例如:

OBJECTIVE-C


Swift 將會看到所有你在? umbrella header? 中公開暴露出來的頭文件,框架 target 中的所有 Swift 文件都可以訪問你 Objc 文件的內容骇笔,不需要任何 import 語句省店。

SWIFT


將 Swift 導入 Objc

要將一些 Swift 文件導入到同個框架的 target 的 Objc 代碼去嚣崭,你不需要導入任何東西到umbrella header文件,而是將 Xcode 為你的Swift代碼自動生成的頭文件導入到你的 Obj .m 源文件去懦傍,以便在 Objc 代碼中訪問 Swift 代碼雹舀。

To import Swift code into Objective-C from the same framework

1.確保將框架target 的 Build Settings > Packaging ?中的 ?Defines Module ?設置為 ?Yes 。用下面的語法將 Swift 代碼導入到同個框架 target 下的 Objc .m 源文件去粗俱。

OBJECTIVE-C


這個 import 語句所包含的 Swift 文件都可以被同個框架 target 下的 Objc .m 源文件訪問说榆。關于在 Objc 代碼中使用 Swift 代碼,詳見 Using Swift from Objective-C寸认。


導入外部 Framework

你可以導入外部框架签财,不管這個框架是純 Objc,純 Swift偏塞,還是混合語言的唱蒸。import 外部框架的流程都是一樣的,不管這個框架是用一種語言寫的灸叼,還是包含兩種語言神汹。當你導入外部框架時,確保? Build Setting > Pakaging > Defines Module? 設置為? Yes 古今。

用下面的語法將框架導入到不同 target 的 Swift 文件中:

SWIFT


用下面的語法將框架導入到不同 target 的 Objc .m 文件中:

OBJECTIVE-C


在Objective-C中使用 Swift

當你將 Swift 代碼導入 Objc 文件之后屁魏,用普通的 Objc 語法使用 Swift 類。

OBJECTIVE-C


Swift 的類或協議必須用? @objc attribute? 來標記捉腥,以便在 Objc 中可訪問氓拼。這個 attribute 告訴編譯器這個 Swift 代碼可以從 Objc 代碼中訪問。如果你的 Swift 類是 Objc 類的子類抵碟,編譯器會自動為你添加? @objc attribute 披诗。詳見 Swift Type Compatibility。

你可以訪問 Swift 類或協議中用 ?@objc attribute ?標記過東西立磁,只要它和 Objc 兼容。不包括一下這些 Swift 獨有的特性:

Generics - 范型

Tuples - 元組

Enumerations defined in Swift - Swift 中定義的枚舉

Structures defined in Swift - Swift 中定義的結構體

Top-level functions defined in Swift - Swift Swift 中定義的頂層函數

Global variables defined in Swift - Swift 中定義的全局變量

Typealiases defined in Swift - Swift 中定義的類型別名

Swift-style variadics

Nested types - 嵌套類型

Curried functions - 柯里化后的函數

例如帶有范型類型作為參數剥槐,或者返回元組的方法不能在Objective-C中使用唱歧。

為了避免循環(huán)引用,不要將 Swift 代碼導入到Objective-C頭文件中粒竖。但是你可以在Objective-C頭文件中前向聲明( forward declare )一個 Swift 類來使用它颅崩,然而,注意不能在Objective-C中繼承一個 Swift 類蕊苗。

To reference a Swift class in an Objective-C header file

這樣前向聲明 Swift 類:

OBJECTIVE-C


Product Module命名

Xcode 為 Swift 代碼生成的頭文件的名稱沿后,以及 Xcode 創(chuàng)建的 Objc 橋接頭文件名稱,都是從你的 product 模塊名生成的朽砰。默認你的 product 模塊名和 product 名一樣尖滚。然而喉刘,如果你的 product 名有特殊字符(nonalphanumeric,非數字漆弄、字母的字符)睦裳,例如點號,那么它們會被下劃線( _ )替換之后作為你的 product 模塊名撼唾。如果 product 名以數字開頭廉邑,那么第一個數字會用下劃線替換掉。

你可以給 product 模塊名提供一個自定義的名稱倒谷,Xcode 會用這個名稱來命名橋接的和自動生成的頭文件蛛蒙。你只需要在修改在 ?build setting ?中的 ?Product Module Name ?即可。

故障建議和提醒

?把 Swift 和 Objc 文件看作相同的代碼集合渤愁,并注意命名沖突牵祟;

?如果你用框架,確保 ?Build Setting > Pakaging > Defines Module ?設置為 ?Yes 猴伶;

?如果你使用 Objc 橋接頭文件课舍,確保在 ?Build Settings ?中 Objc 橋接頭文件的 ?build setting ?是基于 Swfit 編譯器,即 ?Code Generation ?含有頭文件的路徑他挎。這個路徑必須是頭文件自身的路徑筝尾,而不是它所在的目錄。

?Xcode 使用你的 product 模塊名办桨,而不是 target 名來命名 Objc 橋接頭文件和為 Swift 自動生成的頭文件筹淫。詳見 Naming Your Product Module;

?為了在 Objc 中可用呢撞, Swift 類必須是 Objc 類的子類损姜,或者用 ?@objc ?標記;

?當你將 Swift 導入到 Objc 中時殊霞,記住 Objc 不會將 Swift 獨有的特性翻譯成 Objc 對應的特性摧阅。詳見列表 Using Swift from Objective-C;

?如果你在 Swift 代碼中使用你自己的 Objc 類型,確保先將對應的 Objc 頭文件導入到你的 Swift 代碼中绷蹲,然后才將 Swift 自動生成的頭文件 import 到 Objc .m 源文件中來訪問 Swift 代碼棒卷。


上圖為2017年最新的視頻教程資料,搜索2352149755加我好友私聊我上傳視頻教程祝钢,有什么不懂的也可以來私聊問我比规。

不定時更新中。

如果你能明白這些視頻資料的好差拦英,那么你也算是入行了蜒什,底層和中高層就是這一步之差。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末疤估,一起剝皮案震驚了整個濱河市灾常,隨后出現的幾起案子霎冯,更是在濱河造成了極大的恐慌,老刑警劉巖岗憋,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件银舱,死亡現場離奇詭異畔柔,居然都是意外死亡黄鳍,警方通過查閱死者的電腦和手機赏淌,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來监徘,“玉大人晋修,你說我怎么就攤上這事』丝” “怎么了墓卦?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長户敬。 經常有香客問我落剪,道長,這世上最難降的妖魔是什么尿庐? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任忠怖,我火速辦了婚禮,結果婚禮上抄瑟,老公的妹妹穿的比我還像新娘凡泣。我一直安慰自己,他們只是感情好皮假,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布鞋拟。 她就那樣靜靜地躺著,像睡著了一般惹资。 火紅的嫁衣襯著肌膚如雪贺纲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天褪测,我揣著相機與錄音猴誊,去河邊找鬼。 笑死汰扭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的福铅。 我是一名探鬼主播萝毛,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滑黔!你這毒婦竟也來了笆包?” 一聲冷哼從身側響起环揽,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庵佣,沒想到半個月后歉胶,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡巴粪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年通今,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛根。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡辫塌,死狀恐怖,靈堂內的尸體忽然破棺而出派哲,到底是詐尸還是另有隱情臼氨,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布芭届,位于F島的核電站储矩,受9級特大地震影響,放射性物質發(fā)生泄漏褂乍。R本人自食惡果不足惜持隧,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望树叽。 院中可真熱鬧舆蝴,春花似錦、人聲如沸题诵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽性锭。三九已至赠潦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間草冈,已是汗流浹背她奥。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怎棱,地道東北人哩俭。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像拳恋,于是被迫代替她去往敵國和親凡资。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容