Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将结构作为数据保存到文件并再次保存_Swift_File_Io - Fatal编程技术网

Swift 将结构作为数据保存到文件并再次保存

Swift 将结构作为数据保存到文件并再次保存,swift,file,io,Swift,File,Io,我试图将一些由变量和UI对象组成的复杂结构的内容写入一个文件。写入文件似乎工作正常,但一旦我尝试读取和解码,我的程序就会崩溃。我写的文件似乎总是16个字节,所以可能不是所有的数据都在写,只是元数据还是什么?我还在文件末尾添加“.fire”作为我自己的扩展名,但我认为这不会有任何效果。请告诉我如何解决这个问题 struct savable { var cs = [String:ScriptObject]() // Complex struct 1 var sc = [FireObj

我试图将一些由变量和UI对象组成的复杂结构的内容写入一个文件。写入文件似乎工作正常,但一旦我尝试读取和解码,我的程序就会崩溃。我写的文件似乎总是16个字节,所以可能不是所有的数据都在写,只是元数据还是什么?我还在文件末尾添加“.fire”作为我自己的扩展名,但我认为这不会有任何效果。请告诉我如何解决这个问题

struct savable {
    var cs = [String:ScriptObject]() // Complex struct 1
    var sc = [FireObject]() // Complex struct 2
}

func saveData() {

    var s = savable()
    s.cs = currentScripts
    s.sc = structuredContent
    let data = archive(w: s)

    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent(fireScripts[localScriptIndex] + ".fire")

    do {
        try data.write(to: fileURL, options: .atomic)
    } catch {
        print(error)
    }
}

func readData(index: Int, goFrom: UIViewController) {

    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent(fireScripts[index] + ".fire")

    do {

        let readData = try Data(contentsOf: fileURL)

        let data = unarchive(d: readData)

        // Breaking here
        print(data.sc[0].type)

    } catch {

    }
}

func archive(w: savable) -> Data {
    var fw = w
    return Data(bytes: &fw, count: MemoryLayout<savable>.stride)
}

func unarchive(d: Data) -> savable {
    guard d.count == MemoryLayout<savable>.stride else {
        fatalError("Error!")
    }

    var w: savable?
    d.withUnsafeBytes({(bytes: UnsafePointer<savable>) -> Void in
        w = UnsafePointer<savable>(bytes).pointee
    })
    return w!
}
struct savable{
var cs=[String:ScriptObject]()//复杂结构1
var sc=[FireObject]()//复杂结构2
}
func saveData(){
var s=savable()
s、 cs=当前脚本
s、 sc=结构内容
让数据=存档(w:s)
让fileURL=try!FileManager.default.url(用于:.documentDirectory,位于:.userDomainMask中,适用于:nil,创建:false)。appendingPathComponent(fireScripts[localScriptIndex]+“.fire”)
做{
尝试数据。写入(到:fileURL,选项:。原子)
}抓住{
打印(错误)
}
}
func readData(索引:Int,goFrom:UIViewController){
让fileURL=try!FileManager.default.url(适用于:.documentDirectory,位于:.userDomainMask中,适用于:nil,创建:false)。appendingPathComponent(fireScripts[index]+“.fire”)
做{
let readData=try Data(contentsOf:fileURL)
let data=unarchive(d:readData)
//在这里突破
打印(data.sc[0].类型)
}抓住{
}
}
func存档(w:savable)->数据{
var fw=w
返回数据(字节:&fw,计数:MemoryLayout.stride)
}
func unarchive(d:数据)->可保存{
guard d.count==MemoryLayout.stride{
fatalError(“错误!”)
}
var w:可以保存吗?
d、 withUnsafeBytes({(字节:UnsafePointer)->中的Void
w=未安全指针(字节)。指针对象
})
返回w!
}

我怀疑写入文件的信息只是结构包含的一对地址。我不认为您应该依赖Swift的内存布局来持久化数据,而是显式地写入和读取实际元素。(例如,NSKeyedArchiver)正如Phillip所说,您希望依靠NSCoding之类的方法来实现这一点。