从一个NSData对象在Swift中创build一个数组

我试图在swift中存储一个整数数组到磁盘。 我可以让他们进入一个NSData对象来存储,但将它们返回到一个数组是困难的。 我可以用data.bytes得到一个原始的COpaquePointer数据,但是找不到用这个指针初始化一个新的swift数组的方法。 有谁知道如何做到这一点?

 import Foundation var arr : UInt32[] = [32,4,123,4,5,2]; let data = NSData(bytes: arr, length: arr.count * sizeof(UInt32)) println(data) //data looks good in the inspector // now get it back into an array? 

你可以使用NSDatagetBytes方法:

 // the number of elements: let count = data.length / sizeof(UInt32) // create array of appropriate length: var array = [UInt32](count: count, repeatedValue: 0) // copy bytes into array data.getBytes(&array, length:count * sizeof(UInt32)) print(array) // Output: [32, 4, 123, 4, 5, 2] 

Swift 3(Xcode 8)的更新: Swift 3有一个新的typesstruct Data ,它是NS(Mutable)Data与适当的值语义的包装。 访问方法稍有不同。

数组到数据:

 var arr: [UInt32] = [32, 4, UInt32.max] let data = Data(buffer: UnsafeBufferPointer(start: &arr, count: arr.count)) print(data) // <20000000 04000000 ffffffff> 

数据到数组:

 let arr2 = data.withUnsafeBytes { Array(UnsafeBufferPointer<UInt32>(start: $0, count: data.count/MemoryLayout<UInt32>.size)) } print(arr2) // [32, 4, 4294967295] 

也可以使用UnsafeBufferPointer ,它实质上是一个“数组指针”,因为它实现了Sequence协议:

 let data = NSData(/* ... */) // Have to cast the pointer to the right size let pointer = UnsafePointer<UInt32>(data.bytes) let count = data.length / 4 // Get our buffer pointer and make an array out of it let buffer = UnsafeBufferPointer<UInt32>(start:pointer, count:count) let array = [UInt32](buffer) 

这消除了首先初始化具有重复元素的空数组然后覆盖它的需要,尽pipe我不知道它是否更快。 由于它使用Sequence协议,这意味着迭代,而不是快速的内存拷贝,虽然我不知道它是否优化了传递缓冲区指针。 然后再次,我不知道有多快的“创build一个与X相同的元素的空数组”是初始化。

这是一个通用的方法来做到这一点。

 import Foundation extension Data { func elements <T> () -> [T] { return withUnsafeBytes { Array(UnsafeBufferPointer<T>(start: $0, count: count/MemoryLayout<T>.size)) } } } let array = [1, 2, 3] let data = Data(buffer: UnsafeBufferPointer(start: array, count: array.count)) let array2: [Int] = data.elements() array == array2 // IN THE PLAYGROUND, THIS SHOWS AS TRUE 

您必须在array2行中指定types。 否则,编译器不能猜测。

如果你正在处理Data to Array(我知道我的数组将会是[String]),我对此感到非常满意:

NSKeyedUnarchiver.unarchiveObject(with:yourData)

我希望它有帮助