You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSKeyedUnarchiver解档[SCNNode]数组与单个SCNNode表现差异问题求助

问题根源

  1. 两个编译错误的原因非常明确:Swift原生数组[SCNNode]是结构体类型,既不继承自NSObject,也没有实现NSCoding协议,完全不满足unarchivedObject(ofClass:from:)对入参类型的要求。
  2. 后续可编译但运行异常的写法有两个问题:
  • 解档逻辑和as!强制转型放在同一个try?作用域内,只要转型失败,整个表达式就会被try?捕获为nil,直接进入else分支
  • guard语句内定义的let components是局部常量,不会对外层提前声明的同名变量赋值,所以你拿到的外层变量始终是空值,才会出现print有输出、调试器显示元素数为0的矛盾情况。

正确实现

分两步处理即可,先解档为NSArray类型,再安全转换为Swift数组:

// 第一步:解档为Foundation框架的NSArray类型
guard let unarchivedArray = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: moleData) else {
    components = []
    return components
}
// 第二步:校验数组内元素类型,安全转为Swift原生的[SCNNode]
guard let validComponents = unarchivedArray as? [SCNNode] else {
    components = []
    return components
}
// 赋值给外层变量后即可正常使用
components = validComponents

也可以合并为简化写法,注意不要用强制转型:

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

内容的提问来源于stack exchange,提问作者bpedit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:06:03