亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

在一個項目中同時使用Swift和Objective-C代碼混合編程的方法

2020-03-09 17:52:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在一個項目中同時使用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 中導入模型的情況,后續章節會有更多細節。

在一個項目中同時使用Swift和Objective-C代碼混合編程的方法

在同個應用的 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代碼混合編程的方法

你應該編輯這個頭文件來對 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 代碼。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久一区二区| 中日韩美女免费视频网站在线观看| 亚洲va电影大全| 欧美日韩亚洲精品一区二区三区| 欧美大片在线看免费观看| 国产精品久久久久av免费| 九色91av视频| 国产精自产拍久久久久久| 国产精品美女久久久免费| 一本大道香蕉久在线播放29| 日韩网站免费观看高清| 亚洲国产天堂久久国产91| 成人黄色在线免费| 亚洲成人av片在线观看| 亚洲欧美日韩视频一区| 亚洲tv在线观看| 成人黄色片在线| 国产精品亚发布| 国产精品网站大全| 国产在线观看一区二区三区| 精品久久久久久亚洲国产300| 欧美在线视频网| 亚洲精选中文字幕| 欧美孕妇毛茸茸xxxx| 国产亚洲人成网站在线观看| 国产成人在线一区| 成人看片人aa| 欧美成aaa人片免费看| 亚洲精品福利资源站| 亚洲国产私拍精品国模在线观看| 中文字幕久精品免费视频| 亚洲视频国产视频| 成人写真视频福利网| 美女扒开尿口让男人操亚洲视频网站| 亚洲精品福利视频| 欧美成人激情视频| 久久久久久久影院| 成人免费视频97| 成人福利网站在线观看| 91精品久久久久久久久久入口| 国产欧美日韩高清| 伊人伊人伊人久久| 亚洲黄页视频免费观看| 亚洲高清在线观看| 欧美精品videos| 亚洲香蕉成人av网站在线观看| 欧美激情三级免费| 尤物九九久久国产精品的分类| 精品久久久久久中文字幕大豆网| 成人亲热视频网站| 国产精品免费电影| 91高清在线免费观看| 92福利视频午夜1000合集在线观看| 欧美性20hd另类| 欧美激情小视频| 国产精品99久久99久久久二8| 国产成人久久精品| 久久久久久国产精品| 91久久久久久久久久| 欧美激情第6页| 亚洲欧美日韩另类| 国内精品久久久久久中文字幕| 波霸ol色综合久久| 91色精品视频在线| 久久久久五月天| 97久久精品在线| 亚洲精品国产综合久久| 国产精品欧美日韩一区二区| 国产成人精品久久| 国产成+人+综合+亚洲欧美丁香花| 欧美性感美女h网站在线观看免费| 久久成年人免费电影| 欧美一级片久久久久久久| 亚洲高清一区二| 国产精品国产福利国产秒拍| 日韩欧美中文字幕在线播放| 黄色成人在线免费| 亚洲欧洲日产国码av系列天堂| 欧美激情aaaa| 久久综合九色九九| 久久精品视频va| 久久夜精品va视频免费观看| 成人午夜高潮视频| 欧美精品在线极品| 2019精品视频| 亚洲福利影片在线| 亚洲欧美激情精品一区二区| 国产视频999| 国产精品久久久久久久9999| 日本中文字幕不卡免费| 欧美一区三区三区高中清蜜桃| 久久久久久久久久久免费| 久久成人人人人精品欧| 国产精品免费一区豆花| 亚洲电影av在线| 亚洲国产91色在线| 亚洲欧美激情在线视频| 国产精品视频一区二区高潮| 欧美高清自拍一区| 国产精品精品视频| 欧美肥臀大乳一区二区免费视频| 国产精品91一区| 91干在线观看| 国产欧美一区二区白浆黑人| 日韩欧美国产一区二区| 欧美成人三级视频网站| 国产精品久久久久久中文字| 亚洲精品一区二三区不卡| 久久久www成人免费精品张筱雨| 日韩av三级在线观看| 国产欧美一区二区三区视频| 国产精品久久一区| 久久久久亚洲精品国产| 综合国产在线观看| 国产精品久久久久久久久粉嫩av| 久久精品视频在线| 成人黄色影片在线| 欧美日韩午夜剧场| 狠狠躁18三区二区一区| 在线看国产精品| 欧美亚洲成人xxx| 亚洲国产精品专区久久| 国产精品久久久久久久久久久久| 91精品国产综合久久香蕉| 日韩欧美国产成人| 亚洲人在线视频| 日韩精品视频在线播放| 欧美精品中文字幕一区| 欧美猛男性生活免费| 国产亚洲精品激情久久| 久久精品一本久久99精品| 国外日韩电影在线观看| 91精品国产综合久久香蕉的用户体验| 色777狠狠综合秋免鲁丝| 亚洲精品天天看| 国产在线视频91| 亚洲偷熟乱区亚洲香蕉av| 成人国产在线视频| 91国产在线精品| 91精品国产综合久久香蕉最新版| 国产精品丝袜久久久久久不卡| 热久久99这里有精品| 欧美日韩成人黄色| 亚洲国产精品va在线看黑人| 黑人巨大精品欧美一区免费视频| 尤物99国产成人精品视频| 国产精品久久婷婷六月丁香| 成人黄色中文字幕| 亚洲一区二区福利| 日韩免费高清在线观看| 最近2019年日本中文免费字幕| 欧美有码在线视频| 日韩国产高清视频在线| 91高清视频免费观看| 国产日韩欧美电影在线观看| 97在线看免费观看视频在线观看| 疯狂做受xxxx欧美肥白少妇| 国产综合色香蕉精品| 亚洲永久免费观看| 福利视频一区二区| 亚洲欧美日韩国产成人| 国产日韩中文字幕| 中文字幕亚洲综合久久筱田步美| 久久久成人的性感天堂|