你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS: 學習筆記, Swift與C指針交互(譯)

iOS: 學習筆記, Swift與C指針交互(譯)

編輯:關於IOS

Swift與C指針交互

Objective-C和C API經常需要使用指針. 在設計上, Swift數據類型可以自然的與基於指針的Cocoa API一起工作, Swift自動處理幾種常用的指針參數. 在本文中, 我們將看到C中的指針參數如何與Swift中的變量,數組,字符串一起工作.   指針作為輸入/輸出參數 C和Objective-C不支持多個返回值, 所以Cocoa API經常使用指針傳遞附加參數到函數. Swift允許把指針參數看成[inout]參數, 所以你可以用同樣的&語法傳遞一個變量的引用作為指針. 例如: UIColor的getRed(_:green:blue:alpha:)方法使用4個CGFloat*指針來接受顏色的組合. 我們可以用&來得到這些值:   var r: CGFloat = 0, g:Float = 0, b:Float = 0, a:Float = 0 color.getRed(&r, green: &g, blue: &b, alpha: &a) 另一個經常使用的是NSError. 許多方法使用了NSError*參數來保存發生的錯誤. 例如: 我們列舉目錄裡的內容使用NSFileManager的contentsOfDirectoryAtPath(_:error:)方法, 直接使用NSError?變量來保存可能的錯誤:   復制代碼 var maybeError:NSError?   if let contents = NSFileManager.defaultManager().contentsOfDirectoryAtPath("/usr/bin", error: &maybeError){       //內容處理       for i in contents{           println(i)       }   }else if let error = maybeError{       //錯誤處理       println(error.description)   } 復制代碼 安全起見, Swift要求變量在使用&前需要初始化. 因為它不知道被調用的方法是否在修改它之前會讀取指針   數組指針 在C中數組與指針緊緊相連. 為方便使用基於數組的C API, Swift允許將Array作為指針. 不可修改數組可以直接當成常量指針, 可修改數組可以使用&操作符做為非常量指針(就和inout參數一樣). 例如: 我們把兩個數組 a 和 b 使用vDSP_vadd函數(Accelerte framework)相加, 把結果寫到第三個數組 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使用 const char*指針作為傳遞字符串的主要方式. Swift String可以作為const char*指針, 它會給函數傳遞一個 null結束, UTF-8編碼的字符串指針. 例如, 我們可以直接給標准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指針的交互方便並提供了一定的安全性, 因為C指針無處不在. 但是, 與C指針交互相對於Swift代碼來說還是內存的不安全, 因此需要特別注意. 特別的: * These conversions cannot safely be used if the callee saves the pointer value for use after it returns. The pointer that results from these conversions is only guaranteed to be valid for the duration of a call. Even if you pass the same variable, array, or string as multiple pointer arguments, you could receive a different pointer each time. An exception to this is global or static stored variables. You can safely use the address of a global variable as a persistent unique pointer value, e.g.: as a KVO context parameter. * Array和String指針沒有邊界檢查. C API不會擴大數組和字符串, 因此在調用前你需要為它分配足夠的大小
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved