Swift 4:可分解的空容器

时间:2018-12-12 14:04:23

标签: swift decodable

我目前正在学习Swift,并且我正在尝试进行一个可以发送两个不同响应的api调用:

第一个是:

{
    "data": {
        "id": 1
},
    "error": null
}

第二个是:

{
    "data": null,
    "error": " Password not matching"
}

因此,在第一个json中,数据是一个嵌套容器,在第二个json中,数据不是嵌套容器。

到目前为止,我有以下内容,在第一种情况下效果很好,但是我不知道如何更改结构以处理第二种情况。任何点击/想法将不胜感激:

struct ApiData {
    let userID: Int?
    let error: String?
}

extension ApiData: Decodable{

    enum CodingKeys: String, CodingKey {
        case data = "data"
        case userId = "id"
        case error = "error"
    }

    init(from decoder: Decoder) throws {

        let container = try decoder.container(keyedBy: CodingKeys.self)
        do {
            let data = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
            let userId = try data.decode(Int.self, forKey: .userId)
            self.init(userID: nil, error: nil)
        } catch let error {
            print(error)
            throw error
        }
    }
}

如果我尝试在do块中解码错误情况,则在收到第一种类型的响应时,将抛出“数据格式不正确的错误”。

1 个答案:

答案 0 :(得分:1)

data是可以为零的对象。您缺少data的可选属性,而userIdid)的属性应该是data的属性。

struct ApiData: Decodable {
    let data: DataObject?
    let error: String?
}

您也没有data的结构

struct DataObject: Decodable {
    let userId: Int

    enum CodingKeys: String, CodingKey {
        case userId = "id"
    }
}

注意:您不必为CodingKeys使用ApiData,只需为DataObject使用