swift - 在 Swift 中将 Double 作为 NS 对象写入文件
问题描述
我有一个应用程序,我已经设置它来保存和加载数据。到目前为止,我已将其设置为将两个数组作为 NSArrays 写入文件。我需要知道的是如何以相同的方式将 Double 写入文件。这是我用来将其写入文件的代码:
func saveData(){
let a = NSArray(array: array1)
do {
try a.write(to: fileURL)
} catch {
print("error writing amounts file")
}
let b = NSArray(array: array2)
do {
try b.write(to: fileURL2)
} catch {
print("error writing description file")
}
我尝试以相同的方式设置它,但没有成功:
let c = NSValue(value: totalDouble)
do {
try c.write(to:fileURL3)
}catch {print("error writing total file")}
}
我尝试过 NSValue、NSNumber 等,但出现错误。我可以将 double 放入一个数组中并像这样保存它,但在我看来这效率很低。我真的不太了解 ObjectiveC 或 NS 对象是什么,所以任何帮助都会很棒。谢谢。
解决方案
如果您想将 Double 保存到文件中,您首先需要将其转换为数据(字节数组):
Xcode 11.3.1 • 斯威夫特 5.1
extension Double {
var data: Data {
var bytes = bitPattern.littleEndian
return .init(bytes: &bytes, count: MemoryLayout<UInt64>.size)
}
}
并将您的数据转换回 Double:
extension Data {
var double: Double {
.init(bitPattern: .init(littleEndian: withUnsafeBytes { $0.load(as: UInt64.self) } ))
}
}
现在您可以将 Double 数据直接写入磁盘:
let value = 2.9
let valueData = value.data
let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let url = documents.appendingPathComponent("file.dat")
do {
try valueData.write(to: url, options: .atomic)
let loadedData = try Data(contentsOf: url)
let loadedValue = loadedData.double
print(loadedValue) // 2.9
} catch {
print(error)
}
推荐阅读
- c# - 调整在运行时动态添加到datagridview的列大小的问题
- c++ - 两个 std::unique_ptr 指向同一个对象——未定义的行为?
- c# - 无法在 chrome 中播放 iframe 中的加密视频。Firefox 和 edge 可以使用相同的 URL 播放相同的 iframe
- python - 如何模拟作为函数输入的对象?
- reactjs - 在没有 onClick 功能的情况下替换文本中的字符串
- https - 使用 GCP 负载均衡器将静态网站重定向到 HTTPS
- python - 检查对象列表中是否存在类属性值
- react-native - React Native Expo 环境变量
- ios - FileManager removeItem() 和 getContent() 问题
- php - Php、bash、sshpass、scp 无法通过 shell_exec 工作