詳解Swift中對C語言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法

詳解Swift中對C語言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、十堰網(wǎng)絡(luò)推廣、小程序設(shè)計、十堰網(wǎng)絡(luò)營銷、十堰企業(yè)策劃、十堰品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供十堰建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn

由于Swift編程語言屬于上層編程語言,而Swift中由于為了低層的高性能計算接口,所以往往需要C語言中的指針類型,由此,在Swift編程語言剛誕生的時候就有了UnsafePointer與UnsafeMutablePointer類型,分別對應(yīng)為const Type*類型與Type *類型。

而在Swift編程語言中,由于一般數(shù)組(Array)對象都無法直接用于C語言中含有指針類型的函數(shù)參數(shù)(比如:void*),所以往往需要將數(shù)組轉(zhuǎn)為指針類型,此外也需要將數(shù)組中元素內(nèi)容存放到連續(xù)的存儲空間。此外,Swift中的字符串對象都是String結(jié)構(gòu)體對象,因此也需要將它們轉(zhuǎn)換為C語言中const char *類型相兼容的類型,因此這里將給大家介紹一些比較簡便、且純Swift接口的使用方法,而不是借助于Objective-C的Foundation庫。

/**
 此函數(shù)用于將一個數(shù)組(Array)的首個元素的值做加1操作
 - parameters:
  - p: inout [Int]類型,傳入的數(shù)組對象首地址
 - returns: Void
*/
func test(inout p: [Int]) {
  p[0] += 1
}

class ViewController: NSViewController {
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    var a = 0
    
    // 下面使用UnsafeMutablePointer自帶的alloc類方法分配10個Int元素的存儲空間
    // 這個方法其實應(yīng)該就是對malloc函數(shù)的封裝了,用于外部的C接口十分有用
    let buf = UnsafeMutablePointer<Int>.alloc(10)
    let dst = UnsafeMutablePointer<Int>.alloc(10)
    
    // 分別對buf與dst存儲空間進行初始化賦值
    for i in 0 ..< 10 {
      buf[i] = i
      dst[i] = 0
    }
    
    // 使用assignBackwardFrom將buf存儲空間中后5個元素拷貝到dst存儲空間的前5個元素中
    dst.assignBackwardFrom(buf.advancedBy(5), count: 5)
    
    // 用Array分配一個10個Int元素的數(shù)組對象arr
    var arr = [Int](count: 10, repeatedValue: 0)
    
    // 將dst中的所有元素拷貝到arr中
    for i in 0 ..< 10 {
      arr[i] = dst[i]
    }
    print(arr)
    
    // 釋放buf與dst。注意,這里必須用dealloc來釋放,且里面的參數(shù)也要與alloc的參數(shù)對應(yīng)!
    // 不釋放會引發(fā)內(nèi)存泄漏
    buf.dealloc(10)
    dst.dealloc(10)
    
    // arr數(shù)組對象指向另一個[1, 2, 3]數(shù)組字面量構(gòu)成的Array對象
    arr = [1, 2, 3]
    
    // 調(diào)用test函數(shù),使得arr的第一個元素的值加1
    test(&arr)
    print("arr = \(arr)")
    
    // 這里使用Array的withUnsafeMutableBufferPointer方法將數(shù)組元素內(nèi)容轉(zhuǎn)為
    // 指向一個連續(xù)存儲空間的首地址。
    // 所以p的類型為:UnsafeMutablePointer<Int>
    let p = arr.withUnsafeMutableBufferPointer() {
      // 這里,形參是一個含有一個UnsafeMutableBufferPointer的形參,
      // 返回類型為UnsafeMutablePointer的函數(shù)類型。
      (inout buffer: UnsafeMutableBufferPointer<Int>) -> UnsafeMutablePointer<Int> in
      return buffer.baseAddress
    }
    
    a = 0
    
    // 我們先查看原先數(shù)組對象中的元素內(nèi)容
    for i in 0 ..< 3 {
      a += p[i]
    }
    print("a = \(a)")
    
    // 我們通過p指針對象對數(shù)組arr的內(nèi)容進行修改
    p[0] -= 1
    p[1] += 1
    p[2] += 2
    
    // 然后打印出修改后的arr數(shù)組對象中的元素內(nèi)容
    print("arr is: \(arr)")
    
    // 這里用nulTerminatedUTF8方法先轉(zhuǎn)為ContiguousArray<CodeUnit>對象類型,
    // 其中,CodeUnit是UInt8類型。
    // 然后用withUnsafeBufferPointer轉(zhuǎn)為UnsafePointer<CChar>類型
    let cstr = "abcd".nulTerminatedUTF8.withUnsafeBufferPointer() {
      return UnsafePointer<CChar>($0.baseAddress)
    }
    
    // 這里再將剛才生成的UnsafePointer<CChar>類型的C格式字符串轉(zhuǎn)回String對象
    let string = String.fromCString(cstr)!
    print("string is: \(string)")
  }
}

上述代碼中,UnsafeMutablePointer的alloc方法也是個很不錯的方法,這個方法應(yīng)該是直接對C語言標(biāo)準(zhǔn)庫malloc的封裝,可以使得我們方便地在Swift中分配連續(xù)的存儲空間,比如對于像圖像處理、矩陣計算等算法尤為實用。當(dāng)然,如果我們的邏輯主要用Array來處理,然后再交給底層的C語言接口做高性能計算,那么也可以使用數(shù)組對象轉(zhuǎn)連續(xù)存儲空間withUnsafeBufferPointer方法,這種處理方式在網(wǎng)絡(luò)數(shù)據(jù)通信中也比較實用。

如有疑問請留言或者到本站社區(qū)交流討論,本站關(guān)于IOS 開發(fā)的文章還有很多,希望大家能搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

分享題目:詳解Swift中對C語言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法
文章轉(zhuǎn)載:http://muchs.cn/article46/jooceg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司App開發(fā)、標(biāo)簽優(yōu)化外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司