国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

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

2019-10-21 18:45:17
字體:
來源:轉載
供稿:網(wǎng)友

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

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

而在Swift編程語言中,由于一般數(shù)組(Array)對象都無法直接用于C語言中含有指針類型的函數(shù)參數(shù)(比如:void*),所以往往需要將數(shù)組轉為指針類型,此外也需要將數(shù)組中元素內(nèi)容存放到連續(xù)的存儲空間。此外,Swift中的字符串對象都是String結構體對象,因此也需要將它們轉換為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元素的存儲空間    // 這個方法其實應該就是對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ù)對應!    // 不釋放會引發(fā)內(nèi)存泄漏    buf.dealloc(10)    dst.dealloc(10)        // arr數(shù)組對象指向另一個[1, 2, 3]數(shù)組字面量構成的Array對象    arr = [1, 2, 3]        // 調(diào)用test函數(shù),使得arr的第一個元素的值加1    test(&arr)    print("arr = /(arr)")        // 這里使用Array的withUnsafeMutableBufferPointer方法將數(shù)組元素內(nèi)容轉為    // 指向一個連續(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方法先轉為ContiguousArray<CodeUnit>對象類型,    // 其中,CodeUnit是UInt8類型。    // 然后用withUnsafeBufferPointer轉為UnsafePointer<CChar>類型    let cstr = "abcd".nulTerminatedUTF8.withUnsafeBufferPointer() {      return UnsafePointer<CChar>($0.baseAddress)    }        // 這里再將剛才生成的UnsafePointer<CChar>類型的C格式字符串轉回String對象    let string = String.fromCString(cstr)!    print("string is: /(string)")  }}

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

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


注:相關教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 海伦市| 文昌市| 隆安县| 宜兰县| 芦溪县| 囊谦县| 民勤县| 双辽市| 儋州市| 桑日县| 平和县| 工布江达县| 汽车| 江西省| 广宗县| 莫力| 芜湖市| 濮阳市| 奎屯市| 阳朔县| 改则县| 同心县| 道孚县| 鹰潭市| 双桥区| 新河县| 金门县| 共和县| 资中县| 伊吾县| 南昌市| 潢川县| 安泽县| 海南省| 南皮县| 大竹县| 静宁县| 西乡县| 安义县| 红安县| 德清县|