NSKeyedUnarchiver解档[SCNNode]数组与单个SCNNode表现差异问题求助
问题根源
- 两个编译错误的原因非常明确:Swift原生数组
[SCNNode]是结构体类型,既不继承自NSObject,也没有实现NSCoding协议,完全不满足unarchivedObject(ofClass:from:)对入参类型的要求。 - 后续可编译但运行异常的写法有两个问题:
- 解档逻辑和
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
相关产品推荐
相关产品推荐

