Swift中如何将含递归数组的Struct转换为Class?
递归结构体转类的解决思路
首先修正你代码里的两处基础错误:
- 创建结构体实例时,
Product(name: "John Jr. II", children: [])是笔误,应该改为PersonStruct(name: "John Jr. II", children: nil)(children是可选数组,用nil更贴合无后代的语义) - 你尝试转换
children时,把[PersonClass]类型的结果赋值给PersonClass类型变量,类型完全不匹配,这是直接报错的核心原因
针对递归数组的映射问题,最简洁的解决方式是给PersonClass添加递归初始化器,让它能接收PersonStruct实例并自动处理所有层级的子节点转换:
// 待转换的结构体 struct PersonStruct { let name: String let children: [PersonStruct]? } // 目标类 class PersonClass { let name: String let children: [PersonClass]? } // 给PersonClass添加递归初始化扩展 extension PersonClass { init(from structModel: PersonStruct) { self.name = structModel.name // 递归处理子节点:如果原结构体有children,遍历每个子节点转换成PersonClass,再包装成可选数组 self.children = structModel.children?.map { PersonClass(from: $0) } } } // 1. 创建正确的结构体实例 let someone = PersonStruct( name: "John", children: [ PersonStruct( name: "John Jr.", children: [ PersonStruct(name: "John Jr. II", children: nil) ] ) ] ) // 2. 一行代码完成全层级递归转换 let somebody = PersonClass(from: someone)
思路说明
- 利用初始化器的递归调用,自动处理嵌套的
children数组:每个子PersonStruct都会被转换成PersonClass,包括更深层级的后代节点 - 借助Swift的可选链
?.和map方法,优雅处理children为nil的情况:如果原结构体的children是nil,转换后的children也会是nil,无需额外判断
内容的提问来源于stack exchange,提问作者Van Du Tran
相关产品推荐
相关产品推荐

