Swift中嵌套Codable结构体操作属性返回nil的问题咨询
核心问题定位
- 可选实例从未完成初始化
声明的var test :Main?是可选类型,默认值为nil,从未通过构造方法生成具体实例;访问属性时未使用可选链防护,写法本身无法通过编译,所有操作不会实际执行,最终打印自然为nil。 - 基础语法错误
- 协议名大小写错误:遵循的协议正确写法为大写开头的
Codable,不是小写codable - 类型名大小写错误:Swift的字符串类型为
String,不是小写string - 字符使用错误:字符串包裹用了中文弯引号
“test”,不符合语法要求 - 元素类型不匹配:url数组的元素类型是
SiteUrl结构体,不能直接追加普通字符串
- 协议名大小写错误:遵循的协议正确写法为大写开头的
- 属性修饰符使用错误
所有结构体内部属性都用了let不可变修饰,就算完成实例化,let修饰的属性初始化后无法执行赋值、数组追加等修改操作,必须替换为var才能动态调整值。 - 嵌套可选属性的空值问题
Main内部的url属性本身是可选的[SiteUrl]?,默认值为nil,不对该属性做初始化就调用append,操作完全无效。 - 跨结构体赋值类型不兼容
People的url属性是非可选的[SiteUrl]类型,而Main的url是可选的[SiteUrl]?,未做可选解包、空值兜底的情况下无法完成赋值。
可运行的修正代码
struct Main: Codable { var name: String? var url: [SiteUrl]? } struct SiteUrl: Codable { var url: String? } struct People: Codable { var nickname: String? var url: [SiteUrl] } // 实例化外层结构体,传入合法初始值 var test: Main? = Main(name: "示例名称", url: []) // 用可选链安全操作嵌套属性,追加匹配类型的元素 test?.url?.append(SiteUrl(url: "test")) // 实例化People,赋值时处理可选类型的空值兜底 var people: People? = People(nickname: "示例昵称", url: test?.url ?? []) print(test)
内容的提问来源于stack exchange,提问作者TheCesco1988
相关产品推荐
相关产品推荐

