【问题标题】:archivedObject(ofClass:from:) treats [SCNNode] differently that SCNNodearchivedObject(ofClass:from:) 对待 [SCNNode] 与 SCNNode 不同
【发布时间】: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]) 出了什么问题。这甚至没有出现在您现在显示的代码中。

标签: ios swift5


【解决方案1】:

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

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

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

【讨论】:

  • 这并不意味着什么。
  • 无赖!我说得太早了。在模拟器上运行良好,在设备上无法运行。
  • 很奇怪,我不明白这是怎么回事。一定是发生了其他事情。
  • 该方法在设备上失败,在guard else 中捕获,但在模拟器上成功。我不明白。
  • 我无法重现这一点,而且这与模拟器和设备之间没有合理的区别。
猜你喜欢
  • 2018-09-24
  • 2018-03-28
  • 2016-01-18
  • 1970-01-01
  • 2017-04-15
  • 2019-08-11
  • 2018-09-01
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多