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