如果存在类型不匹配错误,是不是可以将变量解码为 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

使用布尔变量在 VBA 中键入不匹配错误

Excel VBA 类型不匹配错误

C# 动态转换超过了不同参数的类型不匹配错误

评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?

检查模板中是不是存在变量,如果不存在则不会在记录器中导致错误