我正在尝试将对象保存/加载到文件,为此我只是将对象( self.game )转换为包含字典的数组,然后使用write(toFile:atomically) :)。但是saveGame方法没有做任何事情:我被允许选择一个文件,按OK并保存面板被解除,但文件并没有真正保存。当我使用loadGame方法时,我发现出现了一个奇怪的错误:
警告:在解析类'ABCDInfo'上的选择器'uniqueId'时,动态访问器无法为实体ABCDInfo找到'uniqueId'的@property实现。您是否记得在@implementation中声明@dynamic或@synthesized?
@IBAction func saveGame(_ sender: NSButton) {
let savePanel = NSSavePanel()
savePanel.allowedFileTypes = ["com.apple.property-list"]
if savePanel.runModal() == NSFileHandlingPanelOKButton {
let file = savePanel.url!.absoluteString
self.game.write(toFile: file)
}
}
@IBAction func loadGame(_ sender: NSButton) {
let openPanel = NSOpenPanel()
openPanel.allowedFileTypes = ["com.apple.property-list"]
if openPanel.runModal() == NSFileHandlingPanelOKButton {
let file = openPanel.url!.absoluteString
self.game = Game(withFile: file)
self.selectedSlot = nil
self.enemySlot = nil
self.restartButton.isEnabled = false
self.updateTurnLabel()
self.chessboardView.reloadData()
}
}
self.game.write(toFile :)方法只是将对象转换为NSArray并将其写入作为参数传递的文件。
答案 0 :(得分:0)
使用字典保存数组时,只需在Objective-C中使用writeToFile
即可。但是除非键是绝对的字符串对象,否则Swift也是如此。您必须先将其NSKeyedArchiver
归档。然后,您可以将其写入文件。如果您不对其进行存档,则最终可能没有带有或没有警告的文件。以下是一个例子。
let title = recordArray[r1].valueForKey("texttitle") as! String
let text = recordArray[r1].valueForKey("texttext") as! String
let urls = recordArray[r1].valueForKey("urls") as! String
var codeArray = [NSDictionary]()
let dict = ["Title":title,"URLs":urls,"Code":text] as NSDictionary // or Dictionary
codeArray.append(dict)
let data = NSKeyedArchiver.archivedDataWithRootObject(codeArray)
data.writeToFile(path, atomically: true)
当您打开文件时,请使用NSKeyedUnarchiver
取消归档数据。