詳解Swift中對(duì)C語(yǔ)言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法
詳解Swift中對(duì)C語(yǔ)言接口緩存的使用以及數(shù)組與字符串轉(zhuǎn)為指針類型的方法
由于Swift編程語(yǔ)言屬于上層編程語(yǔ)言,而Swift中由于為了低層的高性能計(jì)算接口,所以往往需要C語(yǔ)言中的指針類型,由此,在Swift編程語(yǔ)言剛誕生的時(shí)候就有了UnsafePointer與UnsafeMutablePointer類型,分別對(duì)應(yīng)為const Type*類型與Type *類型。
而在Swift編程語(yǔ)言中,由于一般數(shù)組(Array)對(duì)象都無(wú)法直接用于C語(yǔ)言中含有指針類型的函數(shù)參數(shù)(比如:void*),所以往往需要將數(shù)組轉(zhuǎn)為指針類型,此外也需要將數(shù)組中元素內(nèi)容存放到連續(xù)的存儲(chǔ)空間。此外,Swift中的字符串對(duì)象都是String結(jié)構(gòu)體對(duì)象,因此也需要將它們轉(zhuǎn)換為C語(yǔ)言中const char *類型相兼容的類型,因此這里將給大家介紹一些比較簡(jiǎn)便、且純Swift接口的使用方法,而不是借助于Objective-C的Foundation庫(kù)。
/** 此函數(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來(lái)釋放,且里面的參數(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)") // 我們通過(guò)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語(yǔ)言標(biāo)準(zhǔn)庫(kù)malloc的封裝,可以使得我們方便地在Swift中分配連續(xù)的存儲(chǔ)空間,比如對(duì)于像圖像處理、矩陣計(jì)算等算法尤為實(shí)用。當(dāng)然,如果我們的邏輯主要用Array來(lái)處理,然后再交給底層的C語(yǔ)言接口做高性能計(jì)算,那么也可以使用數(shù)組對(duì)象轉(zhuǎn)連續(xù)存儲(chǔ)空間withUnsafeBufferPointer方法,這種處理方式在網(wǎng)絡(luò)數(shù)據(jù)通信中也比較實(shí)用。
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,本站關(guān)于IOS 開(kāi)發(fā)的文章還有很多,希望大家能搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
iOS開(kāi)發(fā)UICollectionView實(shí)現(xiàn)拖拽效果
這篇文章主要為大家詳細(xì)介紹了iOS開(kāi)發(fā)UICollectionView實(shí)現(xiàn)拖拽效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01iOS 高德地圖仿微信發(fā)送實(shí)時(shí)位置
這篇文章主要介紹了iOS 高德地圖仿微信發(fā)送實(shí)時(shí)位置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03iOS開(kāi)發(fā)之路--仿網(wǎng)易抽屜效果
本文是IOS開(kāi)發(fā)之路系列的第一篇,主要講訴了如何仿網(wǎng)易新聞客戶端實(shí)現(xiàn)抽屜效果,全部源代碼都分享給大家,希望對(duì)大家有所幫助2014-08-08iOS如何實(shí)現(xiàn)強(qiáng)制轉(zhuǎn)屏、強(qiáng)制橫屏和強(qiáng)制豎屏的實(shí)例代碼
本篇文章主要介紹了iOS如何實(shí)現(xiàn)強(qiáng)制轉(zhuǎn)屏、強(qiáng)制橫屏和強(qiáng)制豎屏的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07ios中g(shù)etTime()的兼容性實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于ios中g(shù)etTime()的兼容性實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2020-03-03iOS overFullScreen與fullScreen區(qū)別分析
這篇文章主要介紹了iOS overFullScreen與fullScreen區(qū)別分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11iOS給圖片添加濾鏡&使用openGLES動(dòng)態(tài)渲染圖片詳解及實(shí)例
這篇文章主要介紹了iOS給圖片添加濾鏡&使用openGLES動(dòng)態(tài)渲染圖片詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-10-10