将对象存储为文件类

时间:2017-11-26 05:31:45

标签: swift nsdata nskeyedarchiver

我有一些课程:A,B,C及其说明:

class A {
    var index: int = 0
    init(){}
}

class B {
    var a1 : A?
    var a2 : A?
    var relation : int?

    init(){}
}

class C {
    var vA : [A] = []
    var vB : [B] = []

    int(){
    }
}

//在主程序中,通过

设置C的数据
var c : C = C()

let a1 : A = A()
a1. index = 1
let a2 : A = A()
a2.index = 2

let b : B = B()
b.a1 = a1
b.a2 = a2
b.releation = 1

c.vA.append(a1)
c.vA.append(a2)

c.vB.append(b)

现在我想将'c'的数据存储到文件中,并在下次从该文件中再次返回。那是什么解决方案?写和读文件或任何建议!

我尝试使用 NSKeyedArchiver 归档数据,然后 NSKeyedUnArchiver 再次取消归档数据,但是,当检查文件始终为“找不到文件”时,和'总是返回NIL'

            var c1 = c
            let dataArchive : Data = Data(bytes: &c1, count: MemoryLayout<C>.stride)

let randomFilename = UUID().uuidString
            let data = NSKeyedArchiver.archivedData(withRootObject: dataArchive)
            let fullPath = getDocumentsDirectory().appendingPathComponent(randomFilename)

            do {
              try data.write(to: fullPath)
            } catch {
                print("Couldn't write file")
            }

            let filemgr = FileManager.default
            if filemgr.fileExists(atPath: fullPath.absoluteString) {
                print("File exists")
            } else {
                print("File not found")
            }
//
     var dataArchiveLoaded : Data?
     let x = NSKeyedUnarchiver.unarchiveObject(withFile: fullPath.absoluteString)
      print(x)  //ALWAYS return NIL

1 个答案:

答案 0 :(得分:0)

如果您使用的是Swift 4,那么在完成后,您始终可以使您的班级文件符合Codable,您可以使用JSONEncoderJSONDecoder对其进行编码和解码对象分别。然后可以将编码数据保存到文件中。如果你更愿意看到一些代码,请告诉我:)。