程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift和C說話混雜編程教程

Swift和C說話混雜編程教程

編輯:更多關於編程

Swift和C說話混雜編程教程。本站提示廣大學習愛好者:(Swift和C說話混雜編程教程)文章只能為提供參考,不一定能成為您想要的結果。以下是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 代碼即便沒有被編譯,也要全體停止語法檢討。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved