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

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

 更新時(shí)間:2017年07月24日 15:04:16   作者:zenny_chen  
這篇文章主要介紹了詳解Swift中對(duì)C語言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法的相關(guān)資料,這里提供簡(jiǎn)單實(shí)例,代碼注釋介紹也清楚,需要的朋友可以參考下

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

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

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

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

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

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

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

相關(guān)文章

  • iOS開發(fā)之如何通過PUT請(qǐng)求上傳數(shù)據(jù)

    iOS開發(fā)之如何通過PUT請(qǐng)求上傳數(shù)據(jù)

    眾所周知一般的服務(wù)器上傳數(shù)據(jù)都是用POST請(qǐng)求,這樣通過AFNetworking的POST請(qǐng)求穩(wěn)穩(wěn)的,但是有一天遇到一個(gè)問題,服務(wù)器上傳數(shù)據(jù)用的是PUT請(qǐng)求,發(fā)現(xiàn)用AFNetworking并不是那么好用,下面這篇文章就來講一下如何通過PUT請(qǐng)求上傳數(shù)據(jù)。有需要的朋友們可以參考借鑒。
    2016-11-11
  • iOS 沙盒圖片保存讀取實(shí)例

    iOS 沙盒圖片保存讀取實(shí)例

    下面小編就為大家分享一篇iOS 沙盒圖片保存讀取實(shí)例,具有很的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Xcode 8新特性的使用和遇到的坑

    Xcode 8新特性的使用和遇到的坑

    這篇文章主要介紹了Xcode 8新特性的使用和遇到的坑,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • iOS13 適配和Xcode11.0踩坑小結(jié)

    iOS13 適配和Xcode11.0踩坑小結(jié)

    這篇文章主要介紹了iOS13 適配和Xcode11.0踩坑小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • iOS 自定義狀態(tài)欄和導(dǎo)航欄詳細(xì)介紹

    iOS 自定義狀態(tài)欄和導(dǎo)航欄詳細(xì)介紹

    這篇文章主要介紹了iOS 自定義狀態(tài)欄和導(dǎo)航欄詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • iOS開發(fā)中指紋識(shí)別簡(jiǎn)單介紹

    iOS開發(fā)中指紋識(shí)別簡(jiǎn)單介紹

    指紋識(shí)別是在iOS8.0以后才推出的,所以我們?nèi)绻氚阎讣y集成到我們的APP當(dāng)中,我們首先就要在代碼中判斷iOS版本。接下來通過本文給大家分享iOS開發(fā)中指紋識(shí)別簡(jiǎn)單介紹,需要的朋友參考下吧
    2017-11-11
  • iOS實(shí)現(xiàn)聯(lián)系人列表功能

    iOS實(shí)現(xiàn)聯(lián)系人列表功能

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)聯(lián)系人列表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Xcode中代碼注釋編寫的一些小技巧

    Xcode中代碼注釋編寫的一些小技巧

    如何在 Xcode 中編寫規(guī)范注釋,規(guī)范注釋可以在Xcode的快速幫助檢查器(quickheliector)中顯示,這篇文章主要給大家介紹了關(guān)于Xcode中代碼注釋編寫的一些小技巧,需要的朋友可以參考下
    2021-10-10
  • IOS 應(yīng)用內(nèi)顯示 AppStore 某個(gè)應(yīng)用的詳情

    IOS 應(yīng)用內(nèi)顯示 AppStore 某個(gè)應(yīng)用的詳情

    本文主要介紹ISO應(yīng)用內(nèi)打開AppStorn 顯示某個(gè)應(yīng)用詳情,這里幫大家總結(jié)了兩種方法,大家對(duì)比一下,在項(xiàng)目中選擇應(yīng)用,
    2016-07-07
  • iOS開發(fā)中的幾個(gè)手勢(shì)操作實(shí)例分享

    iOS開發(fā)中的幾個(gè)手勢(shì)操作實(shí)例分享

    這篇文章主要介紹了iOS開發(fā)中的幾個(gè)手勢(shì)操作實(shí)例分享,編寫代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-09-09

最新評(píng)論

扎兰屯市| 深圳市| 双辽市| 安徽省| 玉屏| 盐源县| 莲花县| 石棉县| 冕宁县| 和平县| 周至县| 高陵县| 罗山县| 绥棱县| 博野县| 旬阳县| 错那县| 鲁甸县| 勐海县| 电白县| 长春市| 东乡族自治县| 永安市| 庆云县| 清水河县| 佛教| 云安县| 庆安县| 海丰县| 南城县| 武邑县| 崇州市| 乌拉特后旗| 南和县| 铁岭县| 邓州市| 大竹县| 孙吴县| 金平| 罗定市| 小金县|