Closed Jaylin0920 closed 3 years ago
String? 在值为 null 或类型不匹配的时候会解析为 nil
TesSubModel? 则只在值为 null 时会解析为nil,因为不确定这个Model里面哪一个字段是你需要保留的。
原因找到了,是定义了可选型,但是我重写了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) //不存在或者类型不匹配,会解析为“” }
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 还是确定型