當前位置:學者齋 >

計算機 >C語言 >

Swift與C語言指標結合使用例項

Swift與C語言指標結合使用例項

引導語:Swift可與Object-C共同運行於MAC OS和iOS平臺,用於搭建基於蘋果平臺的應用程式。以下是本站小編分享給大家的Swift與C語言指標結合使用例項,歡迎閱讀!

Swift與C語言指標結合使用例項

####用以輸入/輸出的引數指標

C和Objective-C並不支援多返回值,所以Cocoa API中常常將指標作為一種在方法間傳遞額外資料的方式。Swift允許指標被當作inout引數使用,所以你可以用符號&將對一個變數的引用作為指標引數傳遞。舉例來說:UIColor中的getRed(_:green:blue:alpha:)方法需要四個CGFloat*指標來接收顏色的組成資訊,我們使用&來將這些組成資訊捕獲為本地變數:

程式碼如下:

var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0

ed(&r, green: &g, blue: &b, alpha: &a)

另一種常見的情況是Cocoa中NSError的習慣用法。許多方法會使用一個NSError**引數來儲存可能的錯誤的資訊。舉例來說:我們用NSFileManager的contentOfDirectoryAtPath(_:error:)方法來將目錄下的內容列表,並將潛在的錯誤指向一個NSError?變數:

程式碼如下:

var maybeError: NSError?

if let contents = ultManager()

entsOfDirectoryAtPath("/usr/bin", error: &maybeError) {

// Work with the directory contents

} else if let error = maybeError {

// Handle the error

}

為了安全性,Swift要求被使用&傳遞的變數已經初始化。因為無法確定這個方法會不會在寫入資料前嘗試從指標中讀取資料。

####作為陣列使用的引數指標

在C語言中,陣列和指標的聯絡十分緊密,而Swift允許陣列能夠作為指標使用,從而與基於陣列的C語言API協同工作更加簡單。一個固定的陣列可以使用一個常量指標直接傳遞,一個變化的陣列可以用&運算子將一個非常量指標傳遞。就和輸入/輸出引數指標一樣。舉例來說:我們可以用Accelerate框架中的vDSP_vadd方法讓兩個陣列a和b相加,並將結果寫入第三個陣列result。

程式碼如下:

import Accelerate

let a: [Float] = [1, 2, 3, 4]

let b: [Float] = [0.5, 0.25, 0.125, 0.0625]

var result: [Float] = [0, 0, 0, 0]

vDSP_vadd(a, 1, b, 1, &result, 1, 4)

// result now contains [1.5, 2.25, 3.125, 4.0625]

#用作字串引數的指標

C語言中用cont char*指標來作為傳遞字串的基本方式。Swift中的String可以被當作一個無限長度UTF-8編碼的const char*指標來傳遞給方法。舉例來說:我們可以直接傳遞一個字串給一個標準C和POSIX庫方法

程式碼如下:

puts("Hello from libc")

let fd = open("/tmp/", O_WRONLY|O_CREAT, 0o666)

if fd < 0 {

perror("could not open /tmp/")

} else {

let text = "Hello World"

write(fd, text, strlen(text))

close(fd)

}

#指標引數轉換的安全性

Swift很努力地使與C語言指標的互動更加便利,因為它們廣泛地存在於Cocoa之中,同時保持一定的'安全性。然而,相比你的其他Swift程式碼與C語言的指標互動具有潛在的不安全性,所以務必要小心使用。其中特別要注意:

●如果被呼叫者為了在其返回值之後再次使用而儲存了C指標的資料,那麼這些轉換使用起來並不安全。轉換後的指標僅在呼叫期間保證有效。甚至你將同樣的變數、陣列或字串作為多指標引數再次傳遞,你每次都會收到一個不同的指標。這個異常將全域性或靜態地儲存為變數。你可以安全地將這段地址當作永久唯一的指標使用。例如:作為一個KVO上下文引數使用的時候。

●當指標型別為Array或String時,溢位檢查不是強制進行的。 基於C語言的API無法增加陣列和字串大小,所以在你將其傳遞到基於C語言的API之前,你必須確保陣列或字元的大小正確。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/cyuyan/pzxxm9.html