国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - Swift與C語言指針結合使用實例

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

2020-12-20 17:05Swift教程網 Swift

這篇文章主要介紹了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中直接用不安全的指針來使用未經處理的內存。在未來的文章中我們將著眼于更加高級的情況。

延伸 · 閱讀

精彩推薦
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現對Mac開發的影響和對Objective-C的影響。...

    Swift教程網4412020-12-16
  • SwiftSwift的74個常用內置函數介紹

    Swift的74個常用內置函數介紹

    這篇文章主要介紹了Swift的74個常用內置函數介紹,這篇文章列舉出了所有的Swift庫函數,內置函數是指無需引入任何模塊即可以直接使用的函數,需要的朋友可...

    Swift教程網5802020-12-19
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環境時,出現了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網2232020-12-16
  • SwiftSwift實現多個TableView側滑與切換效果

    Swift實現多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術師14382021-01-06
  • SwiftSwift使用CollectionView實現廣告欄滑動效果

    Swift使用CollectionView實現廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術博客12372021-01-13
  • SwiftSwift教程之基礎數據類型詳解

    Swift教程之基礎數據類型詳解

    這篇文章主要介紹了Swift教程之基礎數據類型詳解,本文詳細講解了Swift中的基本數據類型和基本語法,例如常量和變量、注釋、分號、整數、數值類型轉換等...

    Swift教程網5162020-12-18
  • SwiftSwift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
主站蜘蛛池模板: www.亚洲黄色 | www.国产.com| 欧美1区2区3区 | 亚洲精品欧美一区二区三区 | 日韩视频在线观看 | 午夜资源 | 久草热8精品视频在线观看 欧美黄色小视频 | 国产精品久久久久久av下载网址 | 亚洲国产一区二区三区 | 色欧美片视频在线观看 | 国产成人片 | 久久久美女 | 国产一区在线视频观看 | 午夜影院免费 | 欧美精品v国产精品v日韩精品 | 欧美一级片 | 成人免费在线 | 久久久久国产一区二区三区四区 | 亚洲电影在线播放 | 在线精品一区 | 欧美成人免费 | 国产精品美女久久久久久免费 | 久久久国产一区二区三区四区小说 | 午夜视频在线观看视频 | 日韩一区电影 | 亚洲综合精品 | 黄色w网站 | 国产日韩精品一区 | 免费骚视频 | 蜜桃臀一区二区三区 | 日韩一二| 精品一区二区三区在线观看 | 亚洲电影二区 | 日韩精品视频在线观看一区二区 | 欧美在线网 | 亚洲精品久久久久一区二区三区 | 嫩草网站在线观看 | 亚洲精品女人久久 | 国产精品中文字幕在线 | 伦理自拍 | 免费午夜视频 |