如果存在类型不匹配错误,是不是可以将变量解码为 nil [重复]
Posted
技术标签:
【中文标题】如果存在类型不匹配错误,是不是可以将变量解码为 nil [重复]【英文标题】:Is it possible to decode variable as nil if there's a type mismatch error [duplicate]如果存在类型不匹配错误,是否可以将变量解码为 nil [重复] 【发布时间】:2020-10-14 21:35:26 【问题描述】:所以基本上我想要的是任何时候 API 返回的类型不同于模型期望使该属性为零的类型。
例如:
struct Person
var name: String?
var someType: String?
如果 API 返回 someType 属性的数字而不是字符串,我只想将其值设为 nil
我知道我可以实现 init(from decoder: Decoder)
初始化程序,但是我必须为每个响应的每个属性设置它,这需要很长时间。有没有更好更快的方法?
【问题讨论】:
那你应该使用 Any 而不是 String 让消费者处理不同的类型。 【参考方案1】:您可以为可选字符串实现自己的 decodeIfPresent 并在类型不匹配时返回 nil。这样您就不必实现自定义初始化程序:
extension KeyedDecodingContainer
public func decodeIfPresent(_ type: String.Type, forKey key: KeyedDecodingContainer<K>.Key) throws -> String?
do
return try decode(String.self, forKey: key)
catch DecodingError.typeMismatch, DecodingError.keyNotFound
return nil
struct Person: Decodable
let name: String?
let someType: String?
let json = #""name":"Steve","someType":1"#
do
let person = try JSONDecoder().decode(Person.self, from: Data(json.utf8))
person.name // "Steve"
person.someType // nil
catch
print(error)
【讨论】:
这是因为您使用扩展来覆盖现有方法。这是非常糟糕的做法。再说一次,你可以把它写成一次尝试吗?陈述。查看链接的副本。 @LeoDabus 所以你定义了一个扩展,而不是明确地调用它,但认为它被调用不是问题?-) 我想这就是你复制和粘贴其他问题的答案时会发生的情况: p @LeoDabus... 实际上来自github.com/marksands/BetterCodable... 它也使用这种方法,但是针对他们自己的自定义类型。因此,我个人不喜欢从整体上覆盖广泛使用类型的默认行为的方法,而是更喜欢属性包装器方法 @NewDev 我已经知道你更喜欢属性包装器。我正在回答这里的问题。一种避免实现自定义初始化程序的方法。 @ClausJørgensen,Leo 绝对没有只是复制粘贴,所以我认为这是不属于 SO 的毫无根据的指责。以上是关于如果存在类型不匹配错误,是不是可以将变量解码为 nil [重复]的主要内容,如果未能解决你的问题,请参考以下文章
gob:类型不匹配:没有匹配的字段编译解码器 - Golang