我正试图将一个整数数组存储到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?

推荐答案

您可以使用NSData中的getBytes方法:

// 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]

Update for Swift 3 (Xcode 8): Swift 3有一个新的struct Data

Array to Data:

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

Data to Array:

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

Update for Swift 5:

Array to Data:

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

Data to Array:

var arr2 = Array<UInt32>(repeating: 0, count: data.count/MemoryLayout<UInt32>.stride)
_ = arr2.withUnsafeMutableBytes { data.copyBytes(to: $0) }
print(arr2) // [32, 4, 4294967295]

Swift相关问答推荐

SwiftData:线程1:&Quot;NSFetchRequest找不到实体名称';提醒&q;的NSEntityDescription

声明一个协议时使用和不使用任何单词有什么区别?

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

swift:只要框架名称中有一个带有框架名称的公共实体,就指定框架中公共 struct 的路径

是否可以使用一个 NSRegularExpression 同时判断字符串格式并提取子字符串?

有没有办法让文本字段以不同的 colored颜色 显示而不影响半透明背景?

从 Obj-C 函数返回 swift 类的不兼容指针类型

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

是否可以利用 Codable 从 Dictionary 初始化符合类型

如何制作进度加载动画?

从 iPhone 中的安全飞地获取真正的随机数?

用逻辑运算符保护让

为什么 Apple Scrumdinger Sample App 使用两个事实来源?

如何仅将 SwiftUI 不透明度应用于父视图?

RxSwift:share() 替代方案,保证upstream 的单一订阅

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

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

Swift中switch 盒的详尽条件

如何轻松删除领域中的所有对象

Swift performSegueWithIdentifier 不起作用