最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift與C語言指針結(jié)合使用實例

 更新時間:2015年05月25日 10:45:57   投稿:junjie  
這篇文章主要介紹了Swift與C語言指針結(jié)合使用實例,本文講解了用以輸入/輸出的參數(shù)指針、作為數(shù)組使用的參數(shù)指針、用作字符串參數(shù)的指針、指針參數(shù)轉(zhuǎn)換的安全性等內(nèi)容,需要的朋友可以參考下

Objective-C和C的API常常會需要用到指針。Swift中的數(shù)據(jù)類型都原生支持基于指針的Cocoa API,不僅如此,Swift會自動處理部分最常用的將指針作為參數(shù)傳遞的情況。這篇文章中,我們將著眼于在Swift中讓C語言指針與變量、數(shù)組和字符串共同工作。
####用以輸入/輸出的參數(shù)指針

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

復(fù)制代碼 代碼如下:

var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
color.getRed(&r, green: &g, blue: &b, alpha: &a)

另一種常見的情況是Cocoa中NSError的習(xí)慣用法。許多方法會使用一個NSError**參數(shù)來儲存可能的錯誤的信息。舉例來說:我們用NSFileManager的contentOfDirectoryAtPath(_:error:)方法來將目錄下的內(nèi)容列表,并將潛在的錯誤指向一個NSError?變量:
復(fù)制代碼 代碼如下:

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)初始化。因為無法確定這個方法會不會在寫入數(shù)據(jù)前嘗試從指針中讀取數(shù)據(jù)。

####作為數(shù)組使用的參數(shù)指針

在C語言中,數(shù)組和指針的聯(lián)系十分緊密,而Swift允許數(shù)組能夠作為指針使用,從而與基于數(shù)組的C語言API協(xié)同工作更加簡單。一個固定的數(shù)組可以使用一個常量指針直接傳遞,一個變化的數(shù)組可以用&運算符將一個非常量指針傳遞。就和輸入/輸出參數(shù)指針一樣。舉例來說:我們可以用Accelerate框架中的vDSP_vadd方法讓兩個數(shù)組a和b相加,并將結(jié)果寫入第三個數(shù)組result。

復(fù)制代碼 代碼如下:

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語言中用cont char*指針來作為傳遞字符串的基本方式。Swift中的String可以被當(dāng)作一個無限長度UTF-8編碼的const char*指針來傳遞給方法。舉例來說:我們可以直接傳遞一個字符串給一個標(biāo)準(zhǔn)C和POSIX庫方法

復(fù)制代碼 代碼如下:

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之中,同時保持一定的安全性。然而,相比你的其他Swift代碼與C語言的指針交互具有潛在的不安全性,所以務(wù)必要小心使用。其中特別要注意:

●如果被調(diào)用者為了在其返回值之后再次使用而保存了C指針的數(shù)據(jù),那么這些轉(zhuǎn)換使用起來并不安全。轉(zhuǎn)換后的指針僅在調(diào)用期間保證有效。甚至你將同樣的變量、數(shù)組或字符串作為多指針參數(shù)再次傳遞,你每次都會收到一個不同的指針。這個異常將全局或靜態(tài)地儲存為變量。你可以安全地將這段地址當(dāng)作永久唯一的指針使用。例如:作為一個KVO上下文參數(shù)使用的時候。

●當(dāng)指針類型為Array或String時,溢出檢查不是強(qiáng)制進(jìn)行的。 基于C語言的API無法增加數(shù)組和字符串大小,所以在你將其傳遞到基于C語言的API之前,你必須確保數(shù)組或字符的大小正確。

如果你需要使用基于指針的API時沒有遵守以上指導(dǎo),或是你重寫了接受指針參數(shù)的Cocoa方法,于是你可以在Swift中直接用不安全的指針來使用未經(jīng)處理的內(nèi)存。在未來的文章中我們將著眼于更加高級的情況。

相關(guān)文章

  • SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI是一種使用Swift語言在蘋果設(shè)備上構(gòu)建用戶界面的創(chuàng)新且簡單的方式,下面這篇文章主要給大家介紹了關(guān)于SwiftUI圖片縮放、拼圖等處理的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Swift使用編解碼庫Codable的過程詳解

    Swift使用編解碼庫Codable的過程詳解

    Codable 是 Swift 引入的全新的編解碼庫,使開發(fā)者更方便的解析JSON 或 plist 文件,支持枚舉、結(jié)構(gòu)體和類,這篇文章主要介紹了Swift使用編解碼庫Codable,需要的朋友可以參考下
    2023-09-09
  • SwiftUI中TabView組件的常規(guī)使用

    SwiftUI中TabView組件的常規(guī)使用

    這篇文章主要給大家介紹了關(guān)于SwiftUI中TabView組件的常規(guī)使用,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-06-06
  • 詳解Swift中的數(shù)據(jù)類型類型轉(zhuǎn)換

    詳解Swift中的數(shù)據(jù)類型類型轉(zhuǎn)換

    Swift中的類型轉(zhuǎn)換可以結(jié)合類的繼承等面向?qū)ο蟮木幊烫匦詠磉M(jìn)行,本文中我們就來詳解Swift中的數(shù)據(jù)類型類型轉(zhuǎn)換,需要的朋友可以參考下
    2016-07-07
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實例方法,封裝特定任務(wù)和功能處理給定類型的一個實例,需要的朋友可以參考下
    2015-01-01
  • Swift心得筆記之運算符

    Swift心得筆記之運算符

    區(qū)別于 C 語言,在 Swift 中你可以對浮點數(shù)進(jìn)行取余運算(%),Swift 還提供了 C 語言沒有的表達(dá)兩數(shù)之間的值的區(qū)間運算符,(a..b和a...b),這方便我們表達(dá)一個區(qū)間內(nèi)的數(shù)值。
    2015-04-04
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)的相關(guān)資料,文中介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift具有一定的參考價值,需要的朋友下面來一起看看吧。
    2017-03-03
  • Swift中內(nèi)置的集合類型學(xué)習(xí)筆記

    Swift中內(nèi)置的集合類型學(xué)習(xí)筆記

    Swift中自帶數(shù)組、set、字典三大集合類型,這里將學(xué)習(xí)過程中的基礎(chǔ)的Swift中內(nèi)置的集合類型學(xué)習(xí)筆記進(jìn)行整理,需要的朋友可以參考下
    2016-06-06
  • Swift 中閉包的簡單使用

    Swift 中閉包的簡單使用

    這篇文章主要介紹了Swift 中閉包的簡單使用的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • swift實現(xiàn)自定義圓環(huán)進(jìn)度提示效果

    swift實現(xiàn)自定義圓環(huán)進(jìn)度提示效果

    這篇文章主要為大家詳細(xì)介紹了swift實現(xiàn)自定義圓環(huán)進(jìn)度提示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論

平潭县| 凯里市| 芜湖市| 江川县| 福州市| 黑山县| 论坛| 深水埗区| 神池县| 富蕴县| 黎城县| 山丹县| 梁山县| 五原县| 澄迈县| 海阳市| 岚皋县| 吉首市| 日喀则市| 隆德县| 烟台市| 汉中市| 雅安市| 社会| 东源县| 静乐县| 宣城市| 桂平市| 朔州市| 长子县| 田阳县| 北碚区| 牙克石市| 新安县| 大名县| 灵璧县| 宿迁市| 江西省| 南昌市| 嘉荫县| 冷水江市|