我有一个已设置用于保存和加载数据的应用程序。到目前为止,我已经设置好将两个数组写入文件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对象到底是不是很了解,所以任何帮助都会很棒。谢谢。
答案 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)
当然,这不是做事的“快速方式” ...但是到目前为止,您只提到了NSObject
(NSArray
等)。