swift - 将 NSKeyedArchiver 与 Swift 数组一起使用
问题描述
我正在尝试使用 NSKeyedArchiver 保存一组数据。数据还包括一个快速的 Ints 数组。对于测试代码,我将一个简单的数据集转换为 Data,然后将其转换回来。请在下面查看我的代码。该代码有效,但我想知道是否有更好的方法来做到这一点。谢谢。
var str = "Hello, playground"
let numbers = [3,5,2,43]
let archiver = NSKeyedArchiver(requiringSecureCoding: true)
if let dataForNumbers = try? NSKeyedArchiver.archivedData(withRootObject: numbers, requiringSecureCoding: true ){
archiver.encode( dataForNumbers, forKey: "numbers" )
archiver.encode( str, forKey: "testString")
}
let data = archiver.encodedData
将数据转换回对象
if let unarchiver = try? NSKeyedUnarchiver.init(forReadingFrom: data ){
let numberData = unarchiver.decodeObject(forKey: "numbers" )
if let numbers = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(numberData as! Data) as? [Int] {
print( numbers )
}
let testString = unarchiver.decodeObject(forKey: "testString") as? String
print( testString )
}
谢谢礼萨
解决方案
是的,如果您询问文件大小和速度,您可以将字符串 utf8 数据保存到文本文件,将整数数组原始数据保存到二进制文件,如下所示:
let str = "Hello, playground"
let numbers = [3, 5, 2, 43]
if let textURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("str.txt"),
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("numbers.bin") {
do {
let strData = Data(str.utf8)
try strData.write(to: textURL)
let numbersData = numbers.withUnsafeBytes { Data($0) }
try numbersData.write(to: fileURL)
let stringFromData = try String(contentsOf: textURL)
let loadedNumbersData = try Data(contentsOf: fileURL)
let numbersFromLoadedData = loadedNumbersData.withUnsafeBytes { [Int]($0.bindMemory(to: Int.self))
}
print(stringFromData)
print(numbersFromLoadedData)
} catch {
print(error)
}
}
这将打印:
你好,游乐场
[3, 5, 2, 43]
推荐阅读
- arrays - 带数组的条件输入
- python - Flask 中的 SQL 更新语句
- python - Get column values on last transaction date
- reactjs - 在 React Native 中设置 Contentful Javascript SDK
- python - 从给出无的字符串中提取子字符串
- ruby-on-rails - 在 gem vs Rails 中访问命名空间类
- sql-server - ROW_NUMBER 分页的 SQL Server 查询性能问题
- javascript - 为什么我的脚本不根据下拉选择显示/隐藏 div?
- python - 使用递归嵌套for循环:如何访问外部循环的索引
- blazor - Blazor InputSelect 布尔问题