天天看點

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

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

Swift與Objective-C檔案可以在一個工程中并存,不管這個工程原本是基于Objective-C還是Swift。你可以直接往現有工程中簡單地添加另一種語言的檔案。這種自然的工作流使得建立混合語言的應用或framework target,與用單獨一種語言時一樣簡單。

編寫混合語言的工作流程隻有一點點差別,這取決于你是在寫應用還是寫架構。下面描述了用兩種語言在一個target中導入模型的情況,後續章節會有更多細節。

在這裡我還是要推薦下我自己建的iOS開發學習群:680565220,群裡都是學ios開發的,如果你正在學習ios ,小編歡迎你加入,今天分享的這個案例已經上傳到群檔案,大家都是軟體開發黨,不定期分享幹貨(隻有iOS軟體開發相關的),包括我自己整理的一份2018最新的iOS進階資料和進階開發教程

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

在同一個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 會自動建立這些頭檔案,反之亦然。

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

如果你同意,Xcode 會在源檔案建立的同時生成頭檔案,并用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

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

2.在Build Settings中,確定Objective-C橋接頭檔案的build setting是基于 Swfit 編譯器,即Code Generation 含有頭檔案的路徑。這個路徑必須是頭檔案自身的路徑,而不是它所在的目錄。

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

在這個橋接頭檔案中列出的所有公開的Objective-C 頭檔案都會對 Swift 可見。之後目前 target 的所有 Swift 檔案都可以使用這些頭檔案中的方法,不需要任何import語句。用 Swift 文法使用這些Objective-C代碼,就像使用系統自帶的類一樣。

SWIFT

iOS學習——Using Swift with Cocoa and 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

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

target 中任何 Swift 檔案将會對 Objc .m 檔案可見,包括這個 import 語句。關于在 Objc 代碼中使用 Swift 代碼,詳見 Using Swift from Objective-C。

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

在同個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

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

Swift 将會看到所有你在  umbrella header  中公開暴露出來的頭檔案,架構 target 中的所有 Swift 檔案都可以通路你 Objc 檔案的内容,不需要任何 import 語句。

SWIFT

iOS學習——Using Swift with Cocoa and Objective-C--在同個工程中使用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

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

這個 import 語句所包含的 Swift 檔案都可以被同個架構 target 下的 Objc .m 源檔案通路。關于在 Objc 代碼中使用 Swift 代碼,詳見 Using Swift from Objective-C。

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

導入外部 Framework

你可以導入外部架構,不管這個架構是純 Objc,純 Swift,還是混合語言的。import 外部架構的流程都是一樣的,不管這個架構是用一種語言寫的,還是包含兩種語言。當你導入外部架構時,確定  Build Setting > Pakaging > Defines Module  設定為  Yes 。

用下面的文法将架構導入到不同 target 的 Swift 檔案中:

SWIFT

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

用下面的文法将架構導入到不同 target 的 Objc .m 檔案中:

OBJECTIVE-C

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

在Objective-C中使用 Swift

當你将 Swift 代碼導入 Objc 檔案之後,用普通的 Objc 文法使用 Swift 類。

OBJECTIVE-C

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

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中使用。

為了避免循環引用,不要将 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

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

Product Module命名

Xcode 為 Swift 代碼生成的頭檔案的名稱,以及 Xcode 建立的 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 代碼。

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