在使用archivedObject(ofClass:from:)进行解档操作时,需要注意对于不同类型的对象需要分别处理。对于包含多个SCNNode的数组,需要使用unarchiver.decodeObject(of: [SCNNode].self, forKey: key)来解码;对于单个SCNNode对象,则需要使用unarchiver.decodeObject(of: SCNNode.self, forKey: key)。
示例代码如下:
// 保存场景 func saveScene() { // ... let sceneData = try NSKeyedArchiver.archivedData(withRootObject: scene, requiringSecureCoding: false) userDefaults.set(sceneData, forKey: "savedScene") }
// 加载场景 func loadScene() { // ...
if let sceneData = userDefaults.data(forKey: "savedScene"),
let unarchiver = try? NSKeyedUnarchiver(forReadingFrom: sceneData) {
// 解码场景
if #available(iOS 12.0, *) {
let scene = try? unarchiver.decodeTopLevelObject(forKey: NSKeyedArchiveRootObjectKey) as? SCNScene
} else {
let scene = unarchiver.decodeObject(of: SCNScene.self, forKey: NSKeyedArchiveRootObjectKey)
}
// 解码节点
if #available(iOS 12.0, *) {
let nodes = try? unarchiver.decodeTopLevelObject(forKey: "nodes") as? [SCNNode]
} else {
let nodes = unarchiver.decodeObject(of: [SCNNode].self, forKey: "nodes")
}
unarchiver.finishDecoding()
}
}