archivedObject(ofClass:from:) 对待 [SCNNode] 的方式与 SCNNode 不同

archivedObject(ofClass:from:) treats [SCNNode] differently that SCNNode

我有两种方法,一种取消存档根 SCNNode,另一种取消存档根 SCNNode 的数组(在单个文件中)。 此单节点代码有效:

guard let component = try? NSKeyedUnarchiver.unarchivedObject(ofClass: SCNNode.self, from: moleData)
    else {
        component = failNode
        return component    // return to moleFunc to abort?
    }

但是当我尝试检索节点数组时,它不起作用:

 guard let components = try? NSKeyedUnarchiver.unarchivedObject(ofClass: [SCNNode].self, from: moleData)
     else {
         components = []
         return components    // return to moleFunc to abort?
     }

在上面,unarchivedObject(ofClass:from:)两个错误: 静态方法'unarchivedObject(ofClass:from:)'要求'[SCNNode]'符合'NSCoding'并且静态方法'unarchivedObject(ofClass:from:)'要求'[SCNNode] ' 继承自 'NSObject'.

下面的表格 运行 可以,但操作无法提取可用的节点数组:

    guard let components = try? (NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: moleData) as! [SCNNode])
         else {
print("unarchivedObject(ofClass: FAIL, components = ", components)
             components = []
             return components    // return to moleFunc to abort
         }

在 else 中,print 打印出“[]”,调试器显示零个元素。

来自 Swift 3 实现的显着行是:

components = (NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? [SCNNode])!

节点文件都作为 plist 驻留在 Bundle 中。

我不知道如何使数组版本“符合”,而单个 SCNNode 就可以了。

解码 SCNNode 数组的现代方法是说

let components = try? NSKeyedUnarchiver.unarchivedArrayOfObjects(ofClass: SCNNode.self, from: moleData)

应该可以。如果没有,您将不得不继续使用已弃用的方法;但我认为它会。