Swift與C說話指針聯合應用實例。本站提示廣大學習愛好者:(Swift與C說話指針聯合應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift與C說話指針聯合應用實例正文
Objective-C和C的API經常會須要用到指針。Swift中的數據類型都原生支撐基於指針的Cocoa API,不只如斯,Swift會主動處置部門最經常使用的將指針作為參數傳遞的情形。這篇文章中,我們將著眼於在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
color.getRed(&r, green: &g, blue: &b, alpha: &a)
另外一種罕見的情形是Cocoa中NSError的習氣用法。很多辦法會應用一個NSError**參數來貯存能夠的毛病的信息。舉例來講:我們用NSFileManager的contentOfDirectoryAtPath(_:error:)辦法來將目次下的內容列表,並將潛伏的毛病指向一個NSError?變量:
var maybeError: NSError?
if let contents = NSFileManager.defaultManager()
.contentsOfDirectoryAtPath("/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/scratch.txt", O_WRONLY|O_CREAT, 0o666)
if fd < 0 {
perror("could not open /tmp/scratch.txt")
} 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之前,你必需確保數組或字符的年夜小准確。
假如你須要應用基於指針的API時沒有遵照以上指點,或是你重寫了接收指針參數的Cocoa辦法,因而你可以在Swift中直接用不平安的指針來應用未經處置的內存。在將來的文章中我們將著眼於加倍高等的情形。