99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

在Swift中使用C語言的指針

發(fā)布時間:2016-12-02 21:18  回復(fù):0  查看:2028   最后回復(fù):2016-12-02 21:18  

Objective-CC語言經(jīng)常需要使用到指針。Swift中的數(shù)據(jù)類型由于良好的設(shè)計,使其可以和基于指針的C語言API無縫混用。同時Swift也可以自動處理大多數(shù)將指針作為參數(shù)的情況。在這篇文章里,我們可以看到在Swift語言中如何將變量、數(shù)組、字符串當做C語言中的指針參數(shù)來使用。

將輸入輸出參數(shù)作為指針參數(shù)

CObjective-C不支持多類型的返回值。所以Cocoa API就使用指針作為函數(shù)的輸入輸出參數(shù),以用來傳遞多類型的數(shù)據(jù)。Swift允許使用指針參數(shù)進行類似inout參數(shù)的處理,所以你可以使用&語法將一個var變量的引用作為指針參數(shù)進行傳遞。比如說,UIColorgetRed(_:green:blue:alpha:)方法,使用4CGFloat*指針用來接收顏色的組成元素。我們可以使用&將這幾個顏色組成部分裝配在本地變量中。

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

color.getRed(&r, green: &g, blue: &b, alpha: &a)

另外一個常見的情況出現(xiàn)在Cocoa NSError類的使用中。很多方法都使用一個NSError**參數(shù)來保存異常信息。比如說,我們可以通過NSFileManager類的contentsOfDirectoryAtPath(_:error:)方法,挪列出指定目錄中的信息,一旦出現(xiàn)疑似異常信息,就將其保存在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要求在使用&傳值時,變量必須是已經(jīng)被初始化的。這是因為Swift無法知道也無法判斷在操作指針之前,該指針是否確實在內(nèi)存有指向的地址。

將數(shù)組作為指針參數(shù)

C語言中,指針與數(shù)組是水乳交融,糾纏不清的。那么為了在Swift中能無縫的使用C語言中基于數(shù)組的一些API,Swift允許將Array作為指針參數(shù)。一個不可變數(shù)組的值可以作為一個const指針參數(shù)直接傳遞,可變數(shù)組可以使用&作為一個非const指針參數(shù)進行傳遞,就inout參數(shù)一樣。比如,我們使用Accelerate框架中的vDSP_vadd函數(shù)對數(shù)組a和數(shù)組b進行相加,將結(jié)果寫入result數(shù)組:

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]

將字符串作為指針參數(shù)

C語言中,傳遞字符串的主要方式是通過const char*指針。在Swift中,String也可以被用作const char*指針,用它可以向函數(shù)傳遞空字符串或UTF-8編碼的字符串。比如,我們可以在標準的C語言和POSIX的庫函數(shù)中直接使用字符串作為參數(shù)傳遞:

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)

}

指針參數(shù)轉(zhuǎn)換的安全性

Swift一直在努力讓我們可以方便的、無縫的使用C語言中的指針,因為在Cocoa中已經(jīng)使用的非常普遍了。雖然Swift是一個類型安全的語言,對指針參數(shù)的轉(zhuǎn)換的安全性也有保障,但是相比Swift原生的其他代碼來說,還是存在著一定的不安全性。所以我們在使用時要格外小心。比如說:

· 如果調(diào)用者在指針返回之后保存了指針指向的對象,那么再去使用這個對象時是不安全的。這些被轉(zhuǎn)換的指針參數(shù)只能在調(diào)用過程中或者發(fā)送消息過程中保證其有效性。即時你使用相同的變量、數(shù)組或者字符串作為多指針參數(shù)進行傳遞,你每次接收到的指針都是不同的。除非是全局或者靜態(tài)變量。你可以安全的使用全局或靜態(tài)變量的指針的參數(shù),比如KVO上下文參數(shù)。

· 當將數(shù)組或字符串作為指針參數(shù)傳遞時,Swift不會檢查其邊界值。在C語言中,數(shù)組和字符串的大小是不能增長的,所以當你將數(shù)組或字符串作為指針參數(shù)傳遞時,要確保它們有足夠的大小,或者適合當前場景的大小。

如果你使用的基于指針的API不在這篇指導(dǎo)內(nèi),或者你需要重寫接收指針參數(shù)的Cocoa方法,那么你可以直接使用Swift原始內(nèi)存中的不安全的指針。我們會在以后的文章中介紹更多Swift的特性。

 

來源:X楓林

您還未登錄,請先登錄

熱門帖子

最新帖子

?