激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Swift - 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

2020-12-14 15:06Swift教程網(wǎng) Swift

這篇文章主要介紹了在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼的方法,在一個(gè)工程中同時(shí)使用Swift和Objective-C混合語(yǔ)言編程的方法,需要的朋友可以參考下

Swift 與 Objective-C 的兼容能力使你可以在同一個(gè)工程中同時(shí)使用兩種語(yǔ)言。你可以用這種叫做 mix and match 的特性來(lái)開(kāi)發(fā)基于混合語(yǔ)言的應(yīng)用,可以用 Swfit 的最新特性實(shí)現(xiàn)應(yīng)用的一部分功能,并無(wú)縫地并入已有的 Objective-C 的代碼中。

Mix and Match 概述

Objective-C 和 Swift 文件可以在一個(gè)工程中并存,不管這個(gè)工程原本是基于 Objective-C 還是 Swift。你可以直接往現(xiàn)有工程中簡(jiǎn)單地添加另一種語(yǔ)言的源文件。這種自然的工作流使得創(chuàng)建混合語(yǔ)言的應(yīng)用或框架 target,與用單獨(dú)一種語(yǔ)言時(shí)一樣簡(jiǎn)單。

混合語(yǔ)言的工作流程只有一點(diǎn)點(diǎn)區(qū)別,這取決于你是在寫(xiě)應(yīng)用還是寫(xiě)框架。下面描述了普通的用兩種語(yǔ)言在一個(gè) target 中導(dǎo)入模型的情況,后續(xù)章節(jié)會(huì)有更多細(xì)節(jié)。

在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

在同個(gè)應(yīng)用的 target 中導(dǎo)入

如果你在寫(xiě)混合語(yǔ)言的應(yīng)用,可能需要用 Swift 代碼訪問(wèn) Objective-C 代碼,或者反之。下面的流程描述了在非框架 target 中的應(yīng)用。

將 Objective-C 導(dǎo)入 Swift

在一個(gè)應(yīng)用的 target 中導(dǎo)入一些 Objective-C 文件供 Swift 代碼使用時(shí),你需要依賴與 Objective-C 的橋接頭文件(bridging header)來(lái)暴露給 Swift。當(dāng)你添加 Swift 文件到現(xiàn)有的 Objective-C 應(yīng)用(或反之)時(shí),Xcode 會(huì)自動(dòng)創(chuàng)建這些頭文件。

如果你同意,Xcode 會(huì)在源文件創(chuàng)建的同時(shí)生成頭文件,并用 product 的模塊名加上 -Bridging-Header.h 命名。關(guān)于 product 的模塊名,詳見(jiàn) Naming Your Product Module。

在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

你應(yīng)該編輯這個(gè)頭文件來(lái)對(duì) Swift 暴露出 Objective-C 代碼。

在同一 target 中將 Objective-C 代碼導(dǎo)入到 Swift 中

1) 在 Objective-C 橋接頭文件中,import 任何你想暴露給 Swift 的頭文件,例如:

復(fù)制代碼 代碼如下:


// OBJECTIVE-C

 

#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h"

 

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

這個(gè)路徑應(yīng)該是你工程的相對(duì)路徑,類(lèi)似 Info.plist 在 Build Settings 中指定的路徑。在大多數(shù)情況下,你不需要修改這個(gè)設(shè)置。

在這個(gè)橋接頭文件中列出的所有 public 的 Objective-C 頭文件都會(huì)對(duì) Swift 可見(jiàn)。之后當(dāng)前 target 的所有 Swift 文件都可以使用這些頭文件中的方法,不需要任何 import 語(yǔ)句。用 Swift 語(yǔ)法使用這些 Objective-C 代碼,就像使用系統(tǒng)自帶的 Swift 類(lèi)一樣。

復(fù)制代碼 代碼如下:


// SWIFT

 

let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"

 

將 Swift 導(dǎo)入 Objective-C

向 Objective-C 中導(dǎo)入Swift 代碼時(shí),你依賴 Xcode 生成的頭文件來(lái)向 Objective-C 暴露 Swift 代碼。這是自動(dòng)生成 Objective-C 頭文件,它包含了你的 target 中所有 Swift 代碼中定義的接口。可以把這個(gè) Objective-C 頭文件看作 Swift 代碼的 umbrella header。它以 product 模塊名加 -Swift.h 來(lái)命名。關(guān)于 product 的模塊名,詳見(jiàn)Naming Your Product Module。

你不需要做任何事情來(lái)生成這個(gè)頭文件,只需要將它導(dǎo)入到你的 Objective-C 代碼來(lái)使用它。注意這個(gè)頭文件中的 Swift 接口包含了它所使用到的所有 Objective-C 類(lèi)型。如果你在 Swift 代碼中使用你自己的 Objective-C 類(lèi)型,確保先將對(duì)應(yīng)的 Objective-C 頭文件導(dǎo)入到你的 Swift 代碼中,然后才將 Swift 自動(dòng)生成的頭文件導(dǎo)入到 Objective-C .m 源文件中來(lái)訪問(wèn) Swift 代碼。

在同一 target 中將 Swift 代碼導(dǎo)入到 Objective-C 中

在相同 target 的 Objective-C .m 源文件中,用下面的語(yǔ)法來(lái)導(dǎo)入Swift 代碼:

復(fù)制代碼 代碼如下:

// OBJECTIVE-C
#import "ProductModuleName-Swift.h"

 

target 中任何 Swift 文件將會(huì)對(duì) Objective-C .m 源文件可見(jiàn),包括這個(gè) import 語(yǔ)句。關(guān)于在 Objective-C 代碼中使用 Swift 代碼,詳見(jiàn) Using Swift from Objective-C。

 

 

導(dǎo)入到 Swift

導(dǎo)入到 Swift

Swift 代碼

不需要import語(yǔ)句

#import

Objective-C 代碼

不需要import語(yǔ)句;需要 Objective-C `umbrella頭文件

#import "Header.h"

 

在同個(gè) Framework 的 target 中導(dǎo)入

如果你在寫(xiě)一個(gè)混合語(yǔ)言的框架,可能會(huì)從 Swift 代碼訪問(wèn) Objective-C 代碼,或者反之。

將 Objective-C 導(dǎo)入 Swift

要將一些 Objective-C 文件導(dǎo)入到同個(gè)框架 target 的 Swift 代碼中去,你需要將這些文件導(dǎo)入到 Objective-C 的 umbrella header來(lái)供框架使用。

在同一 framework 中將 Objective-C 代碼導(dǎo)入到 Swift 中

確保將框架 target 的 Build Settings > Packaging > Defines Module 設(shè)置為 Yes。然后在你的 umbrella header 頭文件中導(dǎo)入你想暴露給 Swift 訪問(wèn)的 Objective-C 頭文件,例如:

 

復(fù)制代碼 代碼如下:

// OBJECTIVE-C
#import <XYZ/XYZCustomCell.h>
#import <XYZ/XYZCustomView.h>
#import <XYZ/XYZCustomViewController.h>

 

Swift 將會(huì)看到所有你在 umbrella header 中公開(kāi)暴露出來(lái)的頭文件,框架 target 中的所有 Swift 文件都可以訪問(wèn)你 Objective-C 文件的內(nèi)容,不需要任何 import 語(yǔ)句。

 

復(fù)制代碼 代碼如下:

// SWIFT
let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"

 

將 Swift 導(dǎo)入 Objective-C

要將一些 Swift 文件導(dǎo)入到同個(gè)框架的 target 的 Objective-C 代碼去,你不需要導(dǎo)入任何東西到 umbrella header 文件,而是將 Xcode 為你的 Swift 代碼自動(dòng)生成的頭文件導(dǎo)入到你的 Obj .m 源文件去,以便在 Objective-C 代碼中訪問(wèn) Swift 代碼。

在同一 framework 中將 Swift 代碼導(dǎo)入到 Objective-C 中

確保將框架 target 的 Build Settings > Packaging 中的 Defines Module 設(shè)置為 Yes。用下面的語(yǔ)法將 Swift 代碼導(dǎo)入到同個(gè)框架 target 下的 Objective-C .m 源文件去。

 

復(fù)制代碼 代碼如下:

// OBJECTIVE-C
#import <ProductName/ProductModuleName-Swift.h>

 

這個(gè) import 語(yǔ)句所包含的 Swift 文件都可以被同個(gè)框架 target 下的 Objective-C .m 源文件訪問(wèn)。關(guān)于在 Objective-C 代碼中使用 Swift 代碼,詳見(jiàn) Using Swift from Objective-C。

 

 

導(dǎo)入到 Swift

導(dǎo)入到 Swift

Swift 代碼

不需要import語(yǔ)句

#import

Objective-C 代碼

不需要import語(yǔ)句;需要 Objective-C `umbrella頭文件

#import "Header.h"

 

在 Objective-C 中使用 Swift

當(dāng)你將 Swift 代碼導(dǎo)入 Objective-C 文件之后,用普通的 Objective-C 語(yǔ)法使用 Swift 類(lèi)。

復(fù)制代碼 代碼如下:


// OBJECTIVE-C

 

MySwiftClass *swiftObject = [[MySwiftClass alloc] init];
[swiftObject swiftMethod];

 

Swift 的類(lèi)或協(xié)議必須用 @Objective-C attribute 來(lái)標(biāo)記,以便在 Objective-C 中可訪問(wèn)。這個(gè) attribute 告訴編譯器這個(gè) Swift 代碼可以從 Objective-C 代碼中訪問(wèn)。如果你的 Swift 類(lèi)是 Objective-C 類(lèi)的子類(lèi),編譯器會(huì)自動(dòng)為你添加 @Objective-C attribute。詳見(jiàn) Swift Type Compatibility。

你可以訪問(wèn) Swift 類(lèi)或協(xié)議中用 @Objective-C attribute 標(biāo)記過(guò)東西,只要它和 Objective-C 兼容。不包括一下這些 Swift 獨(dú)有的特性:

•Generics - 范型
•Tuples - 元組
•Enumerations defined in Swift - Swift 中定義的枚舉
•Structures defined in Swift - Swift 中定義的結(jié)構(gòu)體
•Top-level functions defined in Swift - Swift Swift 中定義的頂層函數(shù)
•Global variables defined in Swift - Swift 中定義的全局變量
•Typealiases defined in Swift - Swift 中定義的類(lèi)型別名
•Swift-style variadics - Swift風(fēng)格可變參數(shù)
•Nested types - 嵌套類(lèi)型
•Curried functions - 柯里化后的函數(shù)

例如帶有范型類(lèi)型作為參數(shù),或者返回元組的方法不能在 Objective-C 中使用。

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

在 Objective-C 頭文件中引用 Swift 類(lèi)

這樣前向聲明 Swift 類(lèi):

復(fù)制代碼 代碼如下:


// OBJECTIVE-C
// MyObjective-CClass.h

 

@class MySwiftClass;

@interface MyObjective-CClass : NSObject
- (MySwiftClass *)returnSwiftObject;
/* ... */
@end

 

Product 模塊命名

Xcode 為 Swift 代碼生成的頭文件的名稱(chēng),以及 Xcode 創(chuàng)建的 Objective-C 橋接頭文件名稱(chēng),都是從你的 product 模塊名生成的。默認(rèn)你的 product 模塊名和 product 名一樣。然而,如果你的 product 名有特殊字符(nonalphanumeric,非數(shù)字、字母的字符),例如點(diǎn)號(hào),那么它們會(huì)被下劃線(_)替換之后作為你的 product 模塊名。如果 product 名以數(shù)字開(kāi)頭,那么第一個(gè)數(shù)字會(huì)用下劃線替換掉。

你可以給 product 模塊名提供一個(gè)自定義的名稱(chēng),Xcode 會(huì)用這個(gè)名稱(chēng)來(lái)命名橋接的和自動(dòng)生成的頭文件。你只需要在修改在build setting 中的 Product Module Name 即可。

問(wèn)題解決提示

•把 Swift 和 Objective-C 文件看作相同的代碼集合,并注意命名沖突;
•如果你用框架,確保 Build Setting > Pakaging > Defines Module 設(shè)置為 Yes;
•如果你使用 Objective-C 橋接頭文件,確保在 Build Settings 中 Objective-C 橋接頭文件的 build setting 是基于 Swfit 編譯器,即 Code Generation 含有頭文件的路徑。這個(gè)路徑必須是頭文件自身的路徑,而不是它所在的目錄;
•Xcode 使用你的 product 模塊名,而不是 target 名來(lái)命名 Objective-C 橋接頭文件和為 Swift 自動(dòng)生成的頭文件。詳見(jiàn) Naming Your Product Module;
•為了在 Objective-C 中可用, Swift 類(lèi)必須是 Objective-C 類(lèi)的子類(lèi),或者用 @Objective-C 標(biāo)記;
•當(dāng)你將 Swift 導(dǎo)入到 Objective-C 中時(shí),記住 Objective-C 不會(huì)將 Swift 獨(dú)有的特性翻譯成 Objective-C 對(duì)應(yīng)的特性。詳見(jiàn)列表Using Swift from Objective-C;
•如果你在 Swift 代碼中使用你自己的 Objective-C 類(lèi)型,確保先將對(duì)應(yīng)的 Objective-C 頭文件導(dǎo)入到你的 Swift 代碼中,然后才將 Swift 自動(dòng)生成的頭文件 import 到 Objective-C .m 源文件中來(lái)訪問(wèn) Swift 代碼。

延伸 · 閱讀

精彩推薦
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網(wǎng)上上看到的答案,復(fù)制粘貼過(guò)來(lái)和大家分享一下,因?yàn)槲液秃芏嗳艘粯雍荜P(guān)心Swift的出現(xiàn)對(duì)Mac開(kāi)發(fā)的影響和對(duì)Objective-C的影響。...

    Swift教程網(wǎng)4412020-12-16
  • Swiftswift where與匹配模式的實(shí)例詳解

    swift where與匹配模式的實(shí)例詳解

    這篇文章主要介紹了swift where與匹配模式的實(shí)例詳解的相關(guān)資料,這里附有簡(jiǎn)單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢(mèng)的魔術(shù)師14382021-01-06
  • SwiftSwift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類(lèi)型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類(lèi)型和基本語(yǔ)法,例如常量和變量、注釋、分號(hào)、整數(shù)、數(shù)值類(lèi)型轉(zhuǎn)換等...

    Swift教程網(wǎng)5162020-12-18
  • SwiftSwift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    Stevin的技術(shù)博客12372021-01-13
  • Swiftmac git xcrun error active developer path 錯(cuò)誤

    mac git xcrun error active developer path 錯(cuò)誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時(shí),出現(xiàn)了錯(cuò)誤(mac git xcrun error active developer path)的解決辦法,希望對(duì)大家有所幫助...

    Swift教程網(wǎng)2232020-12-16
  • SwiftSwift的74個(gè)常用內(nèi)置函數(shù)介紹

    Swift的74個(gè)常用內(nèi)置函數(shù)介紹

    這篇文章主要介紹了Swift的74個(gè)常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫(kù)函數(shù),內(nèi)置函數(shù)是指無(wú)需引入任何模塊即可以直接使用的函數(shù),需要的朋友可...

    Swift教程網(wǎng)5802020-12-19
  • SwiftSwift中轉(zhuǎn)義閉包示例詳解

    Swift中轉(zhuǎn)義閉包示例詳解

    在Swift 中的閉包類(lèi)似于結(jié)構(gòu)塊,并可以在任何地方調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Swift中轉(zhuǎn)義閉包的相關(guān)資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
主站蜘蛛池模板: 久久网站免费 | 日韩精品99久久久久久 | 国产一级不卡毛片 | 久草在线资源观看 | 成人爽a毛片免费啪啪红桃视频 | 毛片免费观看视频 | 日本在线国产 | 中文字幕精品在线视频 | 一级黄色免费观看视频 | 国产精品久久av | 国产在线免费 | 免费高清一级欧美片在线观看 | 国产久草视频在线 | 欧美一级久久 | 91av爱爱| 国外成人在线视频 | 精品国产第一区二区三区 | 日日摸夜夜骑 | 国产电影av在线 | 91视频观看| 在线免费观看欧美 | 国产精品久久久久久久久久久久久久久久 | 亚洲一区二区三区在线看 | 性生活视频软件 | 91九色视频观看 | 成人在线激情视频 | 久久亚洲线观看视频 | 欧美特黄特色视频 | 男女羞羞视频在线免费观看 | 国产正在播放 | 在线看一区二区三区 | 99精品视频一区二区三区 | 国产一区精品在线观看 | 91麻豆精品国产91久久久点播时间 | 久久免费视屏 | 一级裸体视频 | 极品大长腿啪啪高潮露脸 | 一级做a爰性色毛片免费 | 综合在线一区 | 午夜视频久久 | 成人三级视频在线观看 |