Записать Double в файл как объект NS в Swift - PullRequest
0 голосов
/ 29 июня 2018

У меня есть приложение, которое я настроил для сохранения и загрузки данных. Пока что я настроил запись двух массивов в файл 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 голосов
/ 29 июня 2018

Если вы хотите знать, как это сделать с 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 и т. Д.).

0 голосов
/ 29 июня 2018

Если вы хотите сохранить 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...