当前位置: 首页 > 面试题库 >

Swift 4 Codable-Bool或String值

郑安晏
2023-03-14
问题内容

寻找一些有关如何处理我最近遇到的情况的意见。

我一直在使用Swift 4s Codable取得成功,但今天发现了我没有想到的崩溃。我正在使用的API说,它boolean为key 返回a
manage_stock

我的存根结构如下:

struct Product: Codable {
    var manage_stock: Bool?
}

效果很好,问题在于API 有时会 返回a string而不是a boolean

因此,我的解码失败并显示:

Expected to decode Bool but found a string/data instead.

该字符串只能等于"parent",我希望它等于false

我也可以将结构更改为var manage_stock: String?是否可以简化从API导入JSON数据的过程。但是,当然,如果我更改了此设置,我的错误将变为:

Expected to decode String but found a number instead.

有没有一种简单的方法来处理这种突变,或者我需要失去所有Codable带来表的自动化并实现我自己的自动化init(decoder: Decoder)

干杯


问题答案:

由于您无法始终控制要使用的API,因此这是一种Codable通过重写直接解决此问题的简单方法init(from:)

struct Product : Decodable {
    // Properties in Swift are camelCased. You can provide the key separately from the property.
    var manageStock: Bool?

    private enum CodingKeys : String, CodingKey {
        case manageStock = "manage_stock"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        do {
            self.manageStock = try container.decodeIfPresent(Bool.self, forKey: .manageStock)
        } catch DecodingError.typeMismatch {
            // There was something for the "manage_stock" key, but it wasn't a boolean value. Try a string.
            if let string = try container.decodeIfPresent(String.self, forKey: .manageStock) {
                // Can check for "parent" specifically if you want.
                self.manageStock = false
            }
        }
    }
}

有关更多信息,请参见编码和解码自定义类型。



 类似资料:
  • 本文向大家介绍string、String;int、Int32;Boolean、bool的区别相关面试题,主要包含被问及string、String;int、Int32;Boolean、bool的区别时的应答技巧和注意事项,需要的朋友参考一下 String、Int32、Boolean等都属于.Net中定义的类, 而string、int、bool相当于C#中对这些类定义的别名。 CTS。  

  • 我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。 我有这个lucene查询 根据我的理解,这是一个必须子句与布尔OR结合的组合: “获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。” 我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:

  • 描述 (Description) clone( bool )方法克隆匹配的DOM Elements及其所有事件处理程序,并选择克隆。 这对于将元素及其事件的副本移动到DOM中的另一个位置非常有用。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.clone( bool ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - bool -

  • 我遇到了一个问题,我有三个if语句,每个语句都有if String==null或String==“”,即使getText没有给出任何值,这些语句也没有激活。

  • 问题内容: 我正在制作一个进行一些数据处理的webapp,因此经常发现自己将字符串(来自URL或文本文件)解析为Python值。 我使用的是一种类似于eval的安全版本的函数(除非它不能读取字符串,而是保留字符串): …但是,这对我来说似乎很难看。有没有更干净的方法可以做到这一点?我发现了类似这样的旧讨论,但是我想知道是否没有一种快速简单的方法(例如我不知道的库函数,还是一个聪明的单行代码?)。

  • 我想从editText获取字符串值,所以我使用TextWatcher onTextChanged方法在我的私有string cName上设置string值。它设置并获得正确的值。 这是我的setter和getter公共类 但是当我想在其他方法中使用getter时,我总是得到私有字符串cName默认值“ggg ”,或者如果我留空,我将得到null。为什么私有字符串cName不停留在设定值上,我该如何