首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Swift中使用带有自定义类型值的可解码协议?

如何在Swift中使用带有自定义类型值的可解码协议?
EN

Stack Overflow用户
提问于 2019-10-02 04:51:22
回答 1查看 123关注 0票数 1

根据我的请求,我有两种类型的响应:第一种:

代码语言:javascript
复制
{
    "status": "success"
    "data": {
        "user_id": 2,
        "user_name": "John"      
    }
}

第二个是:

代码语言:javascript
复制
{
    "status": "error",
    "data": [],
}

我正在使用这样的struct:

代码语言:javascript
复制
struct ValyutaListData:Decodable {
    let status: String? 
    let data: [String]?
}

但是如果响应是第一个类型的响应,那么就会发生错误。因为在第一种类型中,响应数据不是数组。它是Json对象。然后我使用这样的结构:

代码语言:javascript
复制
struct ValyutaListData:Decodable {
    let status: String? 
    let data: Persondata?
}

struct Persondata: Decodable{
    let user_id: Int?
    let user_name: String?
}

如果响应是第二类型响应,则会出现错误。动态类型JSON应该使用哪种结构?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 05:06:46

一种合理的解决方案是使用关联类型的枚举

代码语言:javascript
复制
struct User : Decodable {
    let userId: Int
    let userName: String
}

enum Result : Decodable {
    case success(User), failure

    enum CodingKeys: String, CodingKey { case status, data }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let status = try container.decode(String.self, forKey: .status)
        if status == "success" {
            let userData = try container.decode(User.self, forKey: .data)
            self = .success(userData)
        } else {
            self = .failure
        }
    }
}

并使用它

代码语言:javascript
复制
do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let result = try decoder.decode(Result.self, from: data)
    switch result {
      case .success(let user): print(user)
      case .failure: print("An error occurred")
    }
} catch { print(error) }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58192100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档