在Swift中将Double写入文件作为NS对象

时间:2018-06-28 22:23:28

标签: swift

我有一个已设置用于保存和加载数据的应用程序。到目前为止,我已经设置好将两个数组写入文件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等,并得到一个错误。我可以将双精度数组放入数组中并像这样保存它,但是在我看来这似乎效率很低。我对ObjectiveC或NS对象到底是不是很了解,所以任何帮助都会很棒。谢谢。

2 个答案:

答案 0 :(得分:1)

如果要将Double存储到文件中,则需要先将其转换为数据(字节数组):

extension Double {
    var data: Data {
        var bytes = bitPattern.littleEndian
        return Data(bytes: &bytes, count: MemoryLayout<UInt64>.size)
    }
}

并将数据转换回Double:

extension Data {
    var double: Double {
        return Double(bitPattern: UInt64(littleEndian: withUnsafeBytes{$0.pointee}))
    }
}

现在您可以将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)
}

答案 1 :(得分:1)

如果您想知道如何使用NSObject,请使用NSData

import Foundation

var d: Double = 1.23456
let dataOut = NSData(bytes: &d, length: MemoryLayout.size(ofValue: d))

do {
    try dataOut.write(toFile: "file.dat")
} catch {
    print("Today ain't my day!")
    exit(1)
}

guard let dataIn = NSData(contentsOfFile: "file.dat") else {
    print("Today really ain't my day!")
    exit(1)
}

let d2 = dataIn.bytes.load(as: Double.self)
assert(d == d2)

当然,这不是做事的“快速方式” ...但是到目前为止,您只提到了NSObjectNSArray等)。