为Decodable结构体添加plist外额外属性的技术疑问
关于Decodable结构体添加额外属性的疑问与优化方案
为什么现有代码能正常运行?
你定义的nouns是计算属性,而非存储属性。Swift的Decodable协议在解码时,只会处理结构体里的存储属性(也就是你写的animal、clothes、food、color这些)。计算属性是基于已有存储属性动态生成的,不需要从plist文件中读取对应字段,所以你的结构体存储属性和plist的结构完全匹配,解码过程不会出现任何问题。
有没有更简洁的实现方式?
你当前的写法已经避开了自定义init和CodingKeys,还能进一步简化nouns的实现——不用额外定义+=运算符,直接用reduce合并字典即可:
struct Phrases: Decodable { let animal: [String: String] let clothes: [String: String] let food: [String: String] let color: [String: String] } extension Phrases { var nouns: [String: String] { [animal, clothes, food].reduce(into: [:]) { $0.merge($1) { $1 } } } }
这段代码逻辑和你的原实现完全一致:把animal、clothes、food三个字典合并,遇到重复键时保留后者的值,但代码更紧凑,也省去了额外的字典扩展。
内容的提问来源于stack exchange,提问作者Daan
相关产品推荐
相关产品推荐

