Swift和C語言混合編程教程_第1頁
Swift和C語言混合編程教程_第2頁
Swift和C語言混合編程教程_第3頁
Swift和C語言混合編程教程_第4頁
Swift和C語言混合編程教程_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Swift和C語言混合編程教程這篇文章主要介紹了Swift和C語言混合編程教程,介紹基本數(shù)據(jù)類型對比、指針、常量等內(nèi)容,需要的朋友可以參考下作為一種可與 Objective-C 相互調(diào)用的語言,Swift 也具有一些與 C 語言的類型和特性,如果你的代碼有需要,Swift 也提供了和常見的 C 代碼結(jié)構(gòu)混合編程的編程方式。 基本數(shù)據(jù)類型 Swift 提供了一些和 C 語言的基本類型如char,int,float,double等價的 Swift 基本數(shù)據(jù)類型。然而,這些 Swift 的核心基本類型之間并不能隱式的相互轉(zhuǎn)換,如 Int。因此,只有你的代碼明確要求它們時再使用這些類型,而 Int 可

2、以在任何你想使用它的時候使用。 C 類型Swift 類型boolCBoolchar, signed charCCharunsigned charCUnsignedCharshortCShortunsigned shortCUnsignedShortintCIntunsigned intCUnsignedIntlongCLongunsigned longCUnsignedLonglong longCLongLongunsigned long longCUnsignedLongLongwchar_tCWideCharchar16_tCChar16char32_tCChar32floatCFloat

3、doubleCDouble 枚舉 Swift 引進了用宏NS_ENUM來標(biāo)記的任何 C 風(fēng)格的枚舉類型。這意味著無論枚舉值是在系統(tǒng)框架還是在自定義的代碼中定義的,當(dāng)他們導(dǎo)入到 Swift 時,他們的前綴名稱將被截斷。例如,看這個 Objective-C 枚舉: 復(fù)制代碼 代碼如下: /Objective-C typedef NS_ENUM(NSInteger, UITableViewCellStyle) UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableView

4、CellStyleSubtitle ; 在 Swift 中這樣來實現(xiàn): 復(fù)制代碼 代碼如下: /Swift enum UITableViewCellStyle: Int case Default case Value1 case Value2 case Subtitle 當(dāng)您需要指向一個枚舉值時,使用以點(.)開頭的枚舉名稱: 復(fù)制代碼 代碼如下: /Swift let cellStyle: UITableViewCellStyle = .Default Swift 也引進了標(biāo)有NS_OPTIONS宏選項。而選項的行為類似于引進的枚舉,選項還可以支持一些位操作,如 ,| 和 。在 Object

5、ive-C 中,你用一個空的選項設(shè)置標(biāo)示恒為零(0)。在 Swift 中,使用 nil代表沒有任何選項。 指針 Swift 盡可能避免讓您直接訪問指針。然而,當(dāng)您需要直接操作內(nèi)存的時候,Swift 也為您提供了多種指針類型。下面的表使用 Type 作為占位符類型名稱來表示語法的映射。 對于參數(shù),使用以下映射: C 句法Swift 句法const void *CConstVoidPointervoid *CMutableVoidPointerconst Type *CConstPointer<Type>Type *CMutablePointer<Type> 對于返回類型,

6、變量和參數(shù)類型的多層次指針,使用以下映射: C 句法Swift 句法void *COpaquePointerType *UnsafePointer<Type> 對于類(class)類型,使用以下映射: C 句法Swift 句法Type * const *CConstPointer<Type>Type * _strong *CMutablePointer<Type>Type *AutoreleasingUnsafePointer<Type> C 可變指針 當(dāng)一個函數(shù)被聲明為接受CMutablePointer<Type>參數(shù)時,這個函數(shù)可

7、以接受下列任何一個類型作為參數(shù): nil,作為空指針傳入 一個CMutablePointer<Type>類型的值 一個操作數(shù)是 Type 類型的左值的輸入輸出表達式,作為這個左值的內(nèi)存地址傳入 一個輸入輸出 Type 值,作為一個數(shù)組的起始指針傳入,并且它的生命周期將在這個調(diào)用期間被延長 如果您像這樣聲明了一個函數(shù): 復(fù)制代碼 代碼如下: /Swift func takesAMutablePointer(x: CMutablePointer<Float>) /*.*/ 那么您可以使用以下任何一種方式來調(diào)用這個函數(shù): 復(fù)制代碼 代碼如下: /Swift var x: Fl

8、oat = 0.0 var p: CMutablePointer<Float> = nil var a: Float = 1.0, 2.0, 3.0 takesAMutablePointer(nil) takesAMutablePointer(p) takesAMutablePointer(&x) takesAMutablePointer(&a) 當(dāng)函數(shù)被聲明使用一個CMutableVoidPointer參數(shù),那么這個函數(shù)接受任何和CMutablePointer<Type>相似類型的Type操作數(shù)。 如果您這樣定義了一個函數(shù): 復(fù)制代碼 代碼如下: /S

9、wift func takesAMutableVoidPointer(x: CMutableVoidPointer) /* . */ 那么您可以使用以下任何一種方式來調(diào)用這個函數(shù): 復(fù)制代碼 代碼如下:/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) takes

10、AMutableVoidPointer(p) takesAMutableVoidPointer(q) takesAMutableVoidPointer(&x) takesAMutableVoidPointer(&y) takesAMutableVoidPointer(&a) takesAMutableVoidPointer(&b) C 常指針 當(dāng)一個函數(shù)被聲明為接受CConstPointer<Type>參數(shù)時,這個函數(shù)可以接受下列任何一個類型作為參數(shù): nil,作為空指針傳入 一個CMutablePointer<Type>, CMutab

11、leVoidPointer, CCPointer<Type>, CConstVoidPointer, 或者在必要情況下轉(zhuǎn)換成CConstPointer<Type>的AutoreleasingUnsafePointer<Type>值 一個操作數(shù)是 Type 類型的左值的輸入輸出表達式,作為這個左值的內(nèi)存地址傳入 一個Type數(shù)組值,作為一個數(shù)組的起始指針傳入,并且它的生命周期將在這個調(diào)用期間被延長 復(fù)制代碼 代碼如下: /Swift func takesAConstPointer(x: CConstPointer<Float>) /*.*/ 那么您

12、可以使用以下任何一種方式來調(diào)用這個函數(shù): 復(fù)制代碼 代碼如下: /Swift var x: Float = 0.0 var p: CConstPointer<Float> = nil takesAConstPointer(nil) takesAConstPointer(p) takesAConstPointer(&x) takesAConstPointer(1.0, 2.0, 3.0) 當(dāng)函數(shù)被聲明使用一個CConstVoidPointer參數(shù),那么這個函數(shù)接受任何和CConstPointer<Type> 相似類型的Type操作數(shù)。 如果您這樣定義了一個函數(shù):

13、復(fù)制代碼 代碼如下: /Swift func takesAConstVoidPointer(x: CConstVoidPointer) /* . */ 那么您可以使用以下任何一種方式來調(diào)用這個函數(shù): 復(fù)制代碼 代碼如下: /Swift var x: Float = 0.0, y: Int = 0 var p: CConstPointer<Float> = nil, q: CConstPointer<Int> = nil takesAConstVoidPointer(nil) takesAConstVoidPointer(p) takesAConstVoidPointer

14、(q) takesAConstVoidPointer(&x) takesAConstVoidPointer(&y) takesAConstVoidPointer(1.0, 2.0, 3.0) takesAConstVoidPointer(1, 2, 3) 自動釋放不安全指針 當(dāng)一個函數(shù)被聲明為接受AutoreleasingUnsafePointer<Type>參數(shù)時,這個函數(shù)可以接受下列任何一個類型作為參數(shù): nil,作為空指針傳入 一個AutoreleasingUnsafePointer<Type>值 其操作數(shù)是原始的,復(fù)制到一個臨時的沒有所有者的緩沖

15、區(qū)的一個輸入輸出表達式,該緩沖區(qū)的地址傳遞給調(diào)用,并返回時,緩沖區(qū)中的值加載,保存,并重新分配到操作數(shù)。 注意:這個列表沒有包含數(shù)組。 如果您這樣定義了一個函數(shù): 復(fù)制代碼 代碼如下: /Swift func takesAnAPointer(x: AutoreleasingUnsafePointer<NSDate?>) /* . */ 那么您可以使用以下任何一種方式來調(diào)用這個函數(shù): 復(fù)制代碼 代碼如下: /Swift var x: NSDate? = nil var p: AutoreleasingUnsafePointer<NSDate?> = nil takesAn

16、AutoreleasingPointer(nil) takesAnAutoreleasingPointer(p) takesAnAutoreleasingPointer(&x) 注意:C 語言函數(shù)指針沒有被 Swift 引進。 全局常量 在 C 和 Objective-C 語言源文件中定義的全局常量會自動地被 Swift 編譯引進并做為 Swift 的全局常量。 預(yù)處理指令 Swift 編譯器不包含預(yù)處理器。取而代之的是,它充分利用了編譯時屬性,生成配置,和語言特性來完成相同的功能。因此,Swift 沒有引進預(yù)處理指令。 簡單宏 在 C 和 Objective-C,您通常使用的#def

17、ine指令定義的一個宏常數(shù),在 Swift,您可以使用全局常量來代替。例如:一個全局定義#define FADE_ANIMATION_DURATION 0.35,在 Swift 可以使用let FADE_ANIMATION_DURATION = 0.35來更好的表述。由于簡單的用于定義常量的宏會被直接被映射成 Swift 全局量,Swift 編譯器會自動引進在 C 或 Objective-C 源文件中定義的簡單宏。 復(fù)雜宏 在 C 和 Objective-C 中使用的復(fù)雜宏在 Swift 中并沒有與之對應(yīng)的定義。復(fù)雜宏是那些不用來定義常量的宏,而是用來定義包含小括號(),函數(shù)的宏。您在 C 和

18、 Objective-C 使用復(fù)雜的宏是用來避免類型檢查的限制和相同代碼的重復(fù)勞動。然而,宏也會產(chǎn)生Bug和重構(gòu)的困難。在 Swift 中你可以直接使用函數(shù)和泛型來達到同樣的效果。因此,在 C 和 Objective-C 源文件中定義的復(fù)雜宏在 Swift 是不能使用的。 編譯配置 Swift 代碼和 Objective-C 代碼以不同的方式進行條件編譯。Swift 代碼可以根據(jù)生成配置的評價配進行有條件的編譯。生成配置包括 true 和 false 字面值,命令行標(biāo)志,和下表中的平臺測試函數(shù)。您可以使用-D <Flag>指定命令行標(biāo)志。 函數(shù)有效參數(shù)os()OSX, iOSarch()x86_64, arm, arm64, i386 注意:arch(arm) 的生成配置不會為64位 arm 設(shè)備返回true,當(dāng)代碼運行在為32位的 ios 模擬器器時,arch(i386) 的生成配置返回true。 一個簡單的條件編譯需要以下代碼格式: 復(fù)制代碼 代碼如下: #if build configuration statements #else statements #endif 一個由零個或多個有效的 Swift 語句聲明的statements,可以包括表達式,語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論