【发布时间】:2021-10-11 00:04:32
【问题描述】:
我有两种方法,一种是取消归档根 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
}
print 在 else 中打印为“[
Swift 3 实现中运行良好的重点是:
components = (NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? [SCNNode])!
节点文件都以 plist 的形式存在于 Bundle 中。
我不知道如何使数组版本“符合”,而单个 SCNNode 就可以了。
【问题讨论】:
-
您说
let components = try? (NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: moleData) as! [SCNNode])“消除了错误,但未能返回正确的值。”你能解释一下你的意思吗?那是一段相当聪明的代码。它以什么方式失败? -
这不是集市。没有讨价还价。它也不是帮助台。这是一本众包百科全书。
-
你的代码没有保护声明。
-
是的,它说你忽略了守卫。但我坚持我所说的。如图所示的代码没有保护语句。如果您需要有关真实代码的帮助,请展示您的真实代码,而不是猜测好的部分是什么。
-
我问你的是
let components = try? (NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: moleData) as! [SCNNode])出了什么问题。这甚至没有出现在您现在显示的代码中。