在一個項目中同時應用Swift和Objective-C代碼混雜編程的辦法。本站提示廣大學習愛好者:(在一個項目中同時應用Swift和Objective-C代碼混雜編程的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是在一個項目中同時應用Swift和Objective-C代碼混雜編程的辦法正文
Swift 與 Objective-C 的兼容才能使你可以在統一個工程中同時應用兩種說話。你可以用這類叫做 mix and match 的特征來開辟基於混雜說話的運用,可以用 Swfit 的最新特征完成運用的一部門功效,並沒有縫地並入已有的 Objective-C 的代碼中。
Mix and Match 概述
Objective-C 和 Swift 文件可以在一個工程中並存,不論這個工程本來是基於 Objective-C 照樣 Swift。你可以直接往現有工程中簡略地添加另外一種說話的源文件。這類天然的任務流使得創立混雜說話的運用或框架 target,與用零丁一種說話時一樣簡略。
混雜說話的任務流程只要一點點差別,這取決於你是在寫運用照樣寫框架。上面描寫了通俗的用兩種說話在一個 target 中導入模子的情形,後續章節會有更多細節。
在同個運用的 target 中導入
假如你在寫混雜說話的運用,能夠須要用 Swift 代碼拜訪 Objective-C 代碼,或許反之。上面的流程描寫了在非框架 target 中的運用。
將 Objective-C 導入 Swift
在一個運用的 target 中導入一些 Objective-C 文件供 Swift 代碼應用時,你須要依附與 Objective-C 的橋接頭文件(bridging header)來裸露給 Swift。當你添加 Swift 文件到現有的 Objective-C 運用(或反之)時,Xcode 會主動創立這些頭文件。
假如你贊成,Xcode 會在源文件創立的同時生成頭文件,並用 product 的模塊名加上 -Bridging-Header.h 定名。關於 product 的模塊名,詳見 Naming Your Product Module。
你應當編纂這個頭文件來對 Swift 裸露出 Objective-C 代碼。
在統一 target 中將 Objective-C 代碼導入到 Swift 中
1) 在 Objective-C 橋接頭文件中,import 任何你想裸露給 Swift 的頭文件,例如:
// OBJECTIVE-C
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"
2) 確保在 Build Settings 中 Objective-C 橋接頭文件的 build setting 是基於 Swfit 編譯器,即 Code Generation 含有頭文件的途徑。這個途徑必需是頭文件本身的途徑,而不是它地點的目次。
這個途徑應當是你工程的絕對途徑,相似 Info.plist 在 Build Settings 中指定的途徑。在年夜多半情形下,你不須要修正這個設置。
在這個橋接頭文件中列出的一切 public 的 Objective-C 頭文件都邑對 Swift 可見。以後以後 target 的一切 Swift 文件都可使用這些頭文件中的辦法,不須要任何 import 語句。用 Swift 語法應用這些 Objective-C 代碼,就像應用體系自帶的 Swift 類一樣。
// SWIFT
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"
將 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 接口包括了它所應用到的一切 Objective-C 類型。假如你在 Swift 代碼中應用你本身的 Objective-C 類型,確保先將對應的 Objective-C 頭文件導入到你的 Swift 代碼中,然後才將 Swift 主動生成的頭文件導入到 Objective-C .m 源文件中來拜訪 Swift 代碼。
在統一 target 中將 Swift 代碼導入到 Objective-C 中
在雷同 target 的 Objective-C .m 源文件中,用上面的語法來導入Swift 代碼:
// OBJECTIVE-C
#import "ProductModuleName-Swift.h"
target 中任何 Swift 文件將會對 Objective-C .m 源文件可見,包含這個 import 語句。關於在 Objective-C 代碼中應用 Swift 代碼,詳見 Using Swift from Objective-C。
導入到 Swift
導入到 Swift
Swift 代碼
不須要import語句
#import
Objective-C 代碼
不須要import語句;須要 Objective-C `umbrella頭文件
#import "Header.h"
在同個 Framework 的 target 中導入
假如你在寫一個混雜說話的框架,能夠會從 Swift 代碼拜訪 Objective-C 代碼,或許反之。
將 Objective-C 導入 Swift
要將一些 Objective-C 文件導入到同個框架 target 的 Swift 代碼中去,你須要將這些文件導入到 Objective-C 的 umbrella header來供框架應用。
在統一 framework 中將 Objective-C 代碼導入到 Swift 中
確保將框架 target 的 Build Settings > Packaging > Defines Module 設置為 Yes。然後在你的 umbrella header 頭文件中導入你想裸露給 Swift 拜訪的 Objective-C 頭文件,例如:
// OBJECTIVE-C
#import <XYZ/XYZCustomCell.h>
#import <XYZ/XYZCustomView.h>
#import <XYZ/XYZCustomViewController.h>
Swift 將會看到一切你在 umbrella header 中地下裸露出來的頭文件,框架 target 中的一切 Swift 文件都可以拜訪你 Objective-C 文件的內容,不須要任何 import 語句。
// SWIFT
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"
將 Swift 導入 Objective-C
要將一些 Swift 文件導入到同個框架的 target 的 Objective-C 代碼去,你不須要導入任何器械到 umbrella header 文件,而是將 Xcode 為你的 Swift 代碼主動生成的頭文件導入到你的 Obj .m 源文件去,以便在 Objective-C 代碼中拜訪 Swift 代碼。
在統一 framework 中將 Swift 代碼導入到 Objective-C 中
確保將框架 target 的 Build Settings > Packaging 中的 Defines Module 設置為 Yes。用上面的語法將 Swift 代碼導入到同個框架 target 下的 Objective-C .m 源文件去。
// OBJECTIVE-C
#import <ProductName/ProductModuleName-Swift.h>
這個 import 語句所包括的 Swift 文件都可以被同個框架 target 下的 Objective-C .m 源文件拜訪。關於在 Objective-C 代碼中應用 Swift 代碼,詳見 Using Swift from Objective-C。
導入到 Swift
導入到 Swift
Swift 代碼
不須要import語句
#import
Objective-C 代碼
不須要import語句;須要 Objective-C `umbrella頭文件
#import "Header.h"
在 Objective-C 中應用 Swift
當你將 Swift 代碼導入 Objective-C 文件以後,用通俗的 Objective-C 語法應用 Swift 類。
// OBJECTIVE-C
MySwiftClass *swiftObject = [[MySwiftClass alloc] init];
[swiftObject swiftMethod];
Swift 的類或協定必需用 @Objective-C attribute 來標志,以便在 Objective-C 中可拜訪。這個 attribute 告知編譯器這個 Swift 代碼可以從 Objective-C 代碼中拜訪。假如你的 Swift 類是 Objective-C 類的子類,編譯器會主動為你添加 @Objective-C attribute。詳見 Swift Type Compatibility。
你可以拜訪 Swift 類或協定頂用 @Objective-C attribute 標志過器械,只需它和 Objective-C 兼容。不包含一下這些 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 - Swift作風可變參數
•Nested types - 嵌套類型
•Curried functions - 柯裡化後的函數
例如帶有范型類型作為參數,或許前往元組的辦法不克不及在 Objective-C 中應用。
為了不輪回援用,不要將 Swift 代碼導入到 Objective-C 頭文件中。然則你可以在 Objective-C 頭文件中前向聲明(forward declare)一個 Swift 類來應用它,但是,留意不克不及在 Objective-C 中繼續一個 Swift 類。
在 Objective-C 頭文件中援用 Swift 類
如許前向聲明 Swift 類:
// OBJECTIVE-C
// MyObjective-CClass.h
@class MySwiftClass;
@interface MyObjective-CClass : NSObject
- (MySwiftClass *)returnSwiftObject;
/* ... */
@end
Product 模塊定名
Xcode 為 Swift 代碼生成的頭文件的稱號,和 Xcode 創立的 Objective-C 橋接頭文件稱號,都是從你的 product 模塊名生成的。默許你的 product 模塊名和 product 名一樣。但是,假如你的 product 名有特別字符(nonalphanumeric,非數字、字母的字符),例如點號,那末它們會被下劃線(_)調換以後作為你的 product 模塊名。假如 product 名以數字開首,那末第一個數字會用下劃線調換失落。
你可以給 product 模塊名供給一個自界說的稱號,Xcode 會用這個稱號來定名橋接的和主動生成的頭文件。你只須要在修正在build setting 中的 Product Module Name 便可。
成績處理提醒
•把 Swift 和 Objective-C 文件看做雷同的代碼聚集,並留意定名抵觸;
•假如你用框架,確保 Build Setting > Pakaging > Defines Module 設置為 Yes;
•假如你應用 Objective-C 橋接頭文件,確保在 Build Settings 中 Objective-C 橋接頭文件的 build setting 是基於 Swfit 編譯器,即 Code Generation 含有頭文件的途徑。這個途徑必需是頭文件本身的途徑,而不是它地點的目次;
•Xcode 應用你的 product 模塊名,而不是 target 名來定名 Objective-C 橋接頭文件和為 Swift 主動生成的頭文件。詳見 Naming Your Product Module;
•為了在 Objective-C 中可用, Swift 類必需是 Objective-C 類的子類,或許用 @Objective-C 標志;
•當你將 Swift 導入到 Objective-C 中時,記住 Objective-C 不會將 Swift 獨有的特征翻譯成 Objective-C 對應的特征。詳見列表Using Swift from Objective-C;
•假如你在 Swift 代碼中應用你本身的 Objective-C 類型,確保先將對應的 Objective-C 頭文件導入到你的 Swift 代碼中,然後才將 Swift 主動生成的頭文件 import 到 Objective-C .m 源文件中來拜訪 Swift 代碼。