亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift與C語言指針結合使用實例

2020-03-09 17:50:42
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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中直接用不安全的指針來使用未經處理的內存。在未來的文章中我們將著眼于更加高級的情況。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久av一区| 欧美高清无遮挡| 理论片在线不卡免费观看| 亚洲精品一二区| 国产日产亚洲精品| 日韩有码在线播放| 美女福利视频一区| 国产精品久久久久免费a∨大胸| 精品精品国产国产自在线| 久久视频这里只有精品| 日韩中文在线不卡| 国产精品69久久| 亚洲男人天堂2023| 亚洲91av视频| 日韩精品有码在线观看| 韩国欧美亚洲国产| 国产精品久久久久久av下载红粉| 自拍偷拍亚洲一区| 亚洲国产中文字幕在线观看| 精品亚洲男同gayvideo网站| 奇米成人av国产一区二区三区| 久久精品国产欧美亚洲人人爽| 久久亚洲国产成人| 日韩av在线免费观看一区| 色妞欧美日韩在线| 疯狂做受xxxx欧美肥白少妇| 91社影院在线观看| 欧美乱人伦中文字幕在线| 日韩免费在线观看视频| 韩国国内大量揄拍精品视频| 久久久久久com| 精品国产成人av| 国产一区二区三区直播精品电影| 伊人久久免费视频| 日韩欧美在线第一页| 欧美成aaa人片免费看| 久久男人av资源网站| 91精品国产成人www| 亚洲男人天堂古典| 亚洲综合精品一区二区| 日韩一区二区三区在线播放| 国产亚洲视频中文字幕视频| 日韩在线视频免费观看高清中文| 久热爱精品视频线路一| 欧美日韩国产va另类| 日韩在线观看免费高清| 九九久久久久久久久激情| 成人午夜激情免费视频| 日韩中文字幕欧美| 国产精品最新在线观看| 欧美午夜视频在线观看| 成人免费在线视频网址| 欧美激情综合色| 日本久久中文字幕| 国产精品成人国产乱一区| 亚洲iv一区二区三区| 日本精品久久久久影院| 久久九九免费视频| 欧美老女人在线视频| 中文字幕亚洲自拍| 91麻豆国产语对白在线观看| 91精品视频在线看| 97超视频免费观看| 欧美激情视频在线免费观看 欧美视频免费一| 日韩精品免费视频| 日韩一区二区三区在线播放| 国语对白做受69| 欧美在线激情视频| 欧美性xxxx极品hd满灌| 日韩在线视频国产| 国产区精品视频| 久久亚洲一区二区三区四区五区高| 日韩av免费观影| 国产日韩精品入口| 欧美中文字幕在线观看| 热99精品里视频精品| 亚洲性生活视频在线观看| 中文字幕精品www乱入免费视频| 亚洲a中文字幕| 日韩中文字幕视频| 日韩日本欧美亚洲| 亚洲激情视频在线观看| 亚洲人成啪啪网站| xxxxx成人.com| 亚洲精品有码在线| 亚洲人成啪啪网站| 亚洲影视九九影院在线观看| 精品亚洲国产视频| 久久天天躁狠狠躁夜夜av| 国产性猛交xxxx免费看久久| 91免费高清视频| 久久久在线免费观看| 麻豆一区二区在线观看| 在线日韩精品视频| 亚洲白虎美女被爆操| 久久久女人电视剧免费播放下载| 97精品一区二区三区| 精品国产乱码久久久久久天美| 国产精品视频地址| 欧美亚洲另类激情另类| 91精品国产91久久久| 久久精品国产视频| 欧美超级免费视 在线| 国产啪精品视频| 欧美激情xxxx性bbbb| 亚洲电影天堂av| 国产精品丝袜久久久久久高清| 亚洲精品一区二区三区婷婷月| 自拍偷拍亚洲精品| 高清欧美一区二区三区| 欧美午夜影院在线视频| 欧美在线视频a| 97av视频在线| 国产成人在线一区| 日韩有码在线视频| 国产在线视频2019最新视频| 久久久国产精品视频| 尤物九九久久国产精品的特点| 亚洲精品福利资源站| 久久久精品美女| 欧美成人免费网| 成人激情春色网| 在线观看成人黄色| 欧美日韩精品在线播放| 韩国一区二区电影| 日韩麻豆第一页| 国产精品高潮粉嫩av| 青草成人免费视频| 亚洲色图狂野欧美| 91a在线视频| 精品一区二区三区四区| 国产精品国产福利国产秒拍| 欧美性黄网官网| 欧美亚洲午夜视频在线观看| 国产性猛交xxxx免费看久久| 欧美最近摘花xxxx摘花| 久久久精品2019中文字幕神马| 欧美国产激情18| 久久久精品美女| 亚洲美女动态图120秒| 欧美性猛交视频| 美女av一区二区三区| 插插插亚洲综合网| 97精品国产aⅴ7777| 精品丝袜一区二区三区| 久久久国产成人精品| 欧美日韩久久久久| 97视频在线看| 亚洲欧美日韩一区在线| 在线观看精品自拍私拍| 91精品国产综合久久男男| 日韩成人黄色av| 欧美大肥婆大肥bbbbb| 国产欧美一区二区三区久久| 成人网在线观看| 国产精品旅馆在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品白浆高清久久久久久| 国产视频精品免费播放| 欧美国产中文字幕| 欧美一级大片在线观看| 亚洲精品一区中文字幕乱码| 亚洲风情亚aⅴ在线发布| 国产精品久久久久久久久久99|