Pircate / CleanJSON

Swift JSON decoder for Codable
MIT License
292 stars 40 forks source link

key定义成可选类型,也会解析为确定类型 #13

Closed Jaylin0920 closed 3 years ago

Jaylin0920 commented 3 years ago

Code

class TesModel: NSObject, Codable { var str: String? var subMod: TesSubModel? } class TesSubModel: NSObject, Codable { var str: String? }

问题

如果str、subModel不存在,或者类型不对,在解析后, str = “” subMod = TesSubModel()

因为model已经定义成可选型,而不是具体类型,此时如果返回的确定类型,而不是nil会感觉很奇怪,使用上也不方便, 比如要判断model是否存在,去做对应处理,应该是 if let model = subMod { xxx } 但是因为返回了确定类型,只是里面没值,就需要在做附加判断处理,比如 if let model = subMod, !model.str.isEmpty { xxx }

期望

定义成可选型后,model解析异常是可以返回nil,或者可以选择可以返回nil 还是确定型

Pircate commented 3 years ago

String? 在值为 null 或类型不匹配的时候会解析为 nil

TesSubModel? 则只在值为 null 时会解析为nil,因为不确定这个Model里面哪一个字段是你需要保留的。

Jaylin0920 commented 3 years ago

原因找到了,是定义了可选型,但是我重写了decoder方法造成的 var strA: String? var strB: String?

required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) strA = try container.decodeIfPresent(String.self, forKey: .strA) //不存在或者类型不匹配,会解析为nil strB = try container.decode(String.self, forKey: .strB) //不存在或者类型不匹配,会解析为“” }