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加我好友私聊我上傳視頻教程祝钢,有什么不懂的也可以來私聊問我比规。
不定時更新中。
如果你能明白這些視頻資料的好差拦英,那么你也算是入行了蜒什,底層和中高層就是這一步之差。