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

首頁 > 編程 > Swift > 正文

Swift和C語言混合編程教程

2020-03-09 17:52:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift和C語言混合編程教程,介紹基本數據類型對比、指針、常量等內容,需要的朋友可以參考下
 

作為一種可與 Objective-C 相互調用的語言,Swift 也具有一些與 C 語言的類型和特性,如果你的代碼有需要,Swift 也提供了和常見的 C 代碼結構混合編程的編程方式。

基本數據類型

Swift 提供了一些和 C 語言的基本類型如char,int,float,double等價的 Swift 基本數據類型。然而,這些 Swift 的核心基本類型之間并不能隱式的相互轉換,如 Int。因此,只有你的代碼明確要求它們時再使用這些類型,而 Int 可以在任何你想使用它的時候使用。

 

C 類型 Swift 類型
bool CBool
char, signed char CChar
unsigned char CUnsignedChar
short CShort
unsigned short CUnsignedShort
int CInt
unsigned int CUnsignedInt
long CLong
unsigned long CUnsignedLong
long long CLongLong
unsigned long long CUnsignedLongLong
wchar_t CWideChar
char16_t CChar16
char32_t CChar32
float CFloat
double CDouble

 

枚舉

Swift 引進了用宏NS_ENUM來標記的任何 C 風格的枚舉類型。這意味著無論枚舉值是在系統框架還是在自定義的代碼中定義的,當他們導入到 Swift 時,他們的前綴名稱將被截斷。例如,看這個 Objective-C 枚舉: 

復制代碼代碼如下:

//Objective-C
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
};

在 Swift 中這樣來實現: 
復制代碼代碼如下:

//Swift
enum UITableViewCellStyle: Int {
    case Default
    case Value1
    case Value2
    case Subtitle
}

 

當您需要指向一個枚舉值時,使用以點(.)開頭的枚舉名稱:

 

復制代碼代碼如下:

//Swift
let cellStyle: UITableViewCellStyle = .Default 

 

Swift 也引進了標有NS_OPTIONS宏選項。而選項的行為類似于引進的枚舉,選項還可以支持一些位操作,如 &,| 和 ~。在 Objective-C 中,你用一個空的選項設置標示恒為零(0)。在 Swift 中,使用 nil代表沒有任何選項。

指針

Swift 盡可能避免讓您直接訪問指針。然而,當您需要直接操作內存的時候,Swift 也為您提供了多種指針類型。下面的表使用 Type 作為占位符類型名稱來表示語法的映射。
對于參數,使用以下映射:

 

C 句法 Swift 句法
const void * CConstVoidPointer
void * CMutableVoidPointer
const Type * CConstPointer<Type>
Type * CMutablePointer<Type>

 


對于返回類型,變量和參數類型的多層次指針,使用以下映射:

 

C 句法 Swift 句法
void * COpaquePointer
Type * UnsafePointer<Type>

 


對于類(class)類型,使用以下映射:

 

C 句法 Swift 句法
Type * const * CConstPointer<Type>
Type * __strong * CMutablePointer<Type>
Type ** AutoreleasingUnsafePointer<Type>

 

C 可變指針

當一個函數被聲明為接受CMutablePointer<Type>參數時,這個函數可以接受下列任何一個類型作為參數:

•nil,作為空指針傳入
•一個CMutablePointer<Type>類型的值
•一個操作數是 Type 類型的左值的輸入輸出表達式,作為這個左值的內存地址傳入
•一個輸入輸出 Type[] 值,作為一個數組的起始指針傳入,并且它的生命周期將在這個調用期間被延長

如果您像這樣聲明了一個函數:

 

復制代碼代碼如下:

//Swift
func takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ } 

 

那么您可以使用以下任何一種方式來調用這個函數: 

復制代碼代碼如下:

//Swift
var x: Float = 0.0
var p: CMutablePointer<Float> = nil
var a: Float[] = [1.0, 2.0, 3.0]

 

takesAMutablePointer(nil)
takesAMutablePointer(p)
takesAMutablePointer(&x)
takesAMutablePointer(&a)

 

當函數被聲明使用一個CMutableVoidPointer參數,那么這個函數接受任何和CMutablePointer<Type>相似類型的Type操作數。

如果您這樣定義了一個函數:

 

復制代碼代碼如下:

//Swift
func takesAMutableVoidPointer(x: CMutableVoidPointer) { /* ... */ } 

 

那么您可以使用以下任何一種方式來調用這個函數:

復制代碼代碼如下:
//Swift
var x: Float = 0.0, y: Int = 0
var p: CMutablePointer<Float> = nil, q: CMutablePointer<Int> = nil
var a: Float[] = [1.0, 2.0, 3.0], b: Int = [1, 2, 3]

 

takesAMutableVoidPointer(nil)
takesAMutableVoidPointer(p)
takesAMutableVoidPointer(q)
takesAMutableVoidPointer(&x)
takesAMutableVoidPointer(&y)
takesAMutableVoidPointer(&a)
takesAMutableVoidPointer(&b)

 

C 常指針

當一個函數被聲明為接受CConstPointer<Type>參數時,這個函數可以接受下列任何一個類型作為參數:

•nil,作為空指針傳入
•一個CMutablePointer<Type>, CMutableVoidPointer, CConstPointer<Type>, CConstVoidPointer, 或者在必要情況下轉換成CConstPointer<Type>的AutoreleasingUnsafePointer<Type>值
•一個操作數是 Type 類型的左值的輸入輸出表達式,作為這個左值的內存地址傳入
•一個Type[]數組值,作為一個數組的起始指針傳入,并且它的生命周期將在這個調用期間被延長

復制代碼代碼如下:

//Swift
func takesAConstPointer(x: CConstPointer<Float>) { /*...*/ } 

 

那么您可以使用以下任何一種方式來調用這個函數: 

復制代碼代碼如下:

//Swift
var x: Float = 0.0
var p: CConstPointer<Float> = nil

 

takesAConstPointer(nil)
takesAConstPointer(p)
takesAConstPointer(&x)
takesAConstPointer([1.0, 2.0, 3.0])

 

當函數被聲明使用一個CConstVoidPointer參數,那么這個函數接受任何和CConstPointer<Type> 相似類型的Type操作數。 ? 如果您這樣定義了一個函數:

 

復制代碼代碼如下:

//Swift ???
func takesAConstVoidPointer(x: CConstVoidPointer) { /* ... */ } 

 

那么您可以使用以下任何一種方式來調用這個函數:

 

復制代碼代碼如下:

//Swift
var x: Float = 0.0, y: Int = 0
var p: CConstPointer<Float> = nil, q: CConstPointer<Int> = nil

 

takesAConstVoidPointer(nil)
takesAConstVoidPointer(p)
takesAConstVoidPointer(q)
takesAConstVoidPointer(&x)
takesAConstVoidPointer(&y)
takesAConstVoidPointer([1.0, 2.0, 3.0])
takesAConstVoidPointer([1, 2, 3])

 

自動釋放不安全指針

當一個函數被聲明為接受AutoreleasingUnsafePointer<Type>參數時,這個函數可以接受下列任何一個類型作為參數:

•nil,作為空指針傳入
•一個AutoreleasingUnsafePointer<Type>值
•其操作數是原始的,復制到一個臨時的沒有所有者的緩沖區的一個輸入輸出表達式,該緩沖區的地址傳遞給調用,并返回時,緩沖區中的值加載,保存,并重新分配到操作數。

注意:這個列表沒有包含數組。

如果您這樣定義了一個函數:

 

復制代碼代碼如下:

 

//Swift
func takesAnAutoreleasingPointer(x: AutoreleasingUnsafePointer<NSDate?>) { /* ... */ } 

 


那么您可以使用以下任何一種方式來調用這個函數: 

復制代碼代碼如下:

//Swift
var x: NSDate? = nil
var p: AutoreleasingUnsafePointer<NSDate?> = nil
?????
takesAnAutoreleasingPointer(nil)
takesAnAutoreleasingPointer(p)
takesAnAutoreleasingPointer(&x)

 

注意:C 語言函數指針沒有被 Swift 引進。

全局常量

在 C 和 Objective-C 語言源文件中定義的全局常量會自動地被 Swift 編譯引進并做為 Swift 的全局常量。

預處理指令

Swift 編譯器不包含預處理器。取而代之的是,它充分利用了編譯時屬性,生成配置,和語言特性來完成相同的功能。因此,Swift 沒有引進預處理指令。

簡單宏

在 C 和 Objective-C,您通常使用的#define指令定義的一個宏常數,在 Swift,您可以使用全局常量來代替。例如:一個全局定義#define FADE_ANIMATION_DURATION 0.35,在 Swift 可以使用let FADE_ANIMATION_DURATION = 0.35來更好的表述。由于簡單的用于定義常量的宏會被直接被映射成 Swift 全局量,Swift 編譯器會自動引進在 C 或 Objective-C 源文件中定義的簡單宏。

復雜宏

在 C 和 Objective-C 中使用的復雜宏在 Swift 中并沒有與之對應的定義。復雜宏是那些不用來定義常量的宏,而是用來定義包含小括號(),函數的宏。您在 C 和 Objective-C 使用復雜的宏是用來避免類型檢查的限制和相同代碼的重復勞動。然而,宏也會產生Bug和重構的困難。在 Swift 中你可以直接使用函數和泛型來達到同樣的效果。因此,在 C 和 Objective-C 源文件中定義的復雜宏在 Swift 是不能使用的。

編譯配置

Swift 代碼和 Objective-C 代碼以不同的方式進行條件編譯。Swift 代碼可以根據生成配置的評價配進行有條件的編譯。生成配置包括 true 和 false 字面值,命令行標志,和下表中的平臺測試函數。您可以使用-D <#Flag#>指定命令行標志。

 

函數 有效參數
os() OSX, iOS
arch() x86_64, arm, arm64, i386

 

注意:arch(arm) 的生成配置不會為64位 arm 設備返回true,當代碼運行在為32位的 ios 模擬器器時,arch(i386) 的生成配置返回true。

一個簡單的條件編譯需要以下代碼格式:

 

復制代碼代碼如下:

#if build configuration
    statements
#else
    statements
#endif

 

一個由零個或多個有效的 Swift 語句聲明的statements,可以包括表達式,語句和控制流語句。您可以添加額外的構建配置要求,條件編譯說明用 && 和 | | 操作符以及 ! 操作符,添加條件控制塊用 #elseif: 

復制代碼代碼如下:

#if build configuration && !build configuration
    statements
#elseif build configuration
    statements
#else
    statements
#endif

 

與 C 語言編譯器的條件編譯相反,Swift 條件編譯語句必須完全是自包含和語法有效的代碼塊。這是因為 Swift 代碼即使沒有被編譯,也要全部進行語法檢查。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av视频在线观看| 成人免费在线网址| 成人久久精品视频| 久久久精品国产亚洲| 国产男女猛烈无遮挡91| 最新91在线视频| 91精品国产高清自在线看超| 成人有码在线视频| 国内免费精品永久在线视频| 国产精品27p| 成人免费大片黄在线播放| 国产精品高潮呻吟久久av黑人| 国产噜噜噜噜久久久久久久久| 国产成人啪精品视频免费网| 中文在线不卡视频| 久久99国产精品久久久久久久久| www欧美xxxx| 91高潮精品免费porn| 久久精品国产精品亚洲| 中文字幕亚洲专区| 国产精品成av人在线视午夜片| 91精品国产精品| 日韩av在线不卡| 国产成人一区二区三区小说| 国产精品视频网址| 国产一区二区三区高清在线观看| 国产精品久久久av久久久| 在线看欧美日韩| 欧美在线影院在线视频| 中文字幕亚洲综合久久| 国产精品大片wwwwww| 91日韩在线播放| 91高清免费视频| …久久精品99久久香蕉国产| 精品国产网站地址| 国产一区二区日韩| 91美女高潮出水| 黑丝美女久久久| 成人做爽爽免费视频| 国产精品久久久91| 日本高清+成人网在线观看| 日韩在线欧美在线国产在线| 国产午夜精品全部视频在线播放| 少妇av一区二区三区| 欧洲亚洲在线视频| 欧美亚洲国产视频小说| 国产精品一区=区| 亚洲自拍中文字幕| 午夜美女久久久久爽久久| 午夜欧美大片免费观看| 亚洲精品日韩丝袜精品| 45www国产精品网站| 国产精品久久久久久影视| 国产中文字幕亚洲| 久色乳综合思思在线视频| 欧美成人精品xxx| 国产欧美日韩亚洲精品| 中日韩美女免费视频网站在线观看| 午夜精品一区二区三区在线视频| 欧美国产中文字幕| 欧美性极品xxxx娇小| 国产精品99久久久久久白浆小说| 久久影院资源站| 日韩中文字幕在线精品| 一区二区三区视频免费在线观看| 亚洲国产另类 国产精品国产免费| 亚洲高清一二三区| 成人激情视频小说免费下载| 一区二区欧美久久| 国产精品高精视频免费| 亚洲福利影片在线| 日日噜噜噜夜夜爽亚洲精品| 亚洲人成电影网| 色香阁99久久精品久久久| 日韩av在线网址| 91精品国产91久久久久| 福利视频一区二区| 亚洲欧洲免费视频| 欧美另类交人妖| 精品视频中文字幕| 久久精品男人天堂| 欧美激情视频一区| 亚洲欧洲在线看| 久久久久久成人| 在线播放国产精品| 久久夜精品va视频免费观看| 日韩av电影免费观看高清| 久久久国产在线视频| 欧美激情xxxx| 国产极品jizzhd欧美| 亚洲无限乱码一二三四麻| 亚洲欧美日韩爽爽影院| 久久久综合免费视频| 欧美性视频精品| 97视频免费在线观看| 亚洲欧美日韩一区二区三区在线| 精品中文字幕乱| 久热99视频在线观看| 成人综合网网址| 久久国产精品久久国产精品| 伊人亚洲福利一区二区三区| 日韩电影免费在线观看中文字幕| 九九热精品在线| 疯狂蹂躏欧美一区二区精品| 日韩精品视频在线观看网址| 日韩欧美中文第一页| 亚洲成人网av| 国外成人免费在线播放| 色偷偷噜噜噜亚洲男人的天堂| 国产91精品久| 亚洲娇小xxxx欧美娇小| 91视频免费在线| 亚洲成人网在线| 国产精品九九久久久久久久| 国产精品久久久久福利| 国产精品视频xxxx| 亚洲欧美国产精品| 欧美亚洲国产视频小说| 久久国产精品偷| 日韩av中文在线| 国产精品一区二区三区成人| 日韩欧美国产黄色| 国产一区二区三区三区在线观看| 成人午夜激情网| 中文字幕av一区| 欧美一乱一性一交一视频| 国产精品美女主播在线观看纯欲| 国产精品久久久91| 精品久久久香蕉免费精品视频| 亚洲国产天堂久久综合网| 亚洲欧美福利视频| 青草青草久热精品视频在线网站| 69精品小视频| 九九热这里只有精品免费看| 韩国国内大量揄拍精品视频| 精品久久国产精品| 91精品久久久久久综合乱菊| 日韩在线免费视频观看| 亚洲欧美国产va在线影院| 91高潮在线观看| 久久中文精品视频| 日韩av影视综合网| 久久99国产综合精品女同| 国产成人精品久久二区二区91| 欧美性猛交xxxx黑人猛交| 中文字幕日韩高清| 亚洲国产成人在线视频| 亚洲乱码国产乱码精品精| 欧美激情va永久在线播放| 成人黄色免费在线观看| 欧美另类第一页| 久久精品成人欧美大片| 在线播放国产一区中文字幕剧情欧美| 国产精品久久久久福利| 欧美日本高清视频| 亚洲影院色在线观看免费| 久久亚洲精品一区二区| 精品高清一区二区三区| 国产精品免费电影| 久久资源免费视频| 国产成人久久久精品一区| 国产精品久久在线观看| 亚洲xxxx做受欧美| 亚洲欧美综合另类中字|