保存/加载文件:“警告:动态访问者无法找到'uniqueId'的@property实现”

时间:2016-11-04 14:49:38

标签: swift macos

我正在尝试将对象保存/加载到文件,为此我只是将对象( 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并将其写入作为参数传递的文件。

enter image description here enter image description here

1 个答案:

答案 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取消归档数据。