首页 > 解决方案 > 在 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 对象是什么,所以任何帮助都会很棒。谢谢。

标签: swift

解决方案


如果您想将 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)
}

推荐阅读