• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

swift - 如何在 Swift 中使枚举可解码?

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:42:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

enum PostType: Decodable {

    init(from decoder: Decoder) throws {

        // What do i put here?
    }

    case Image
    enum CodingKeys: String, CodingKey {
        case image
    }
}

我要做什么来完成这个? 另外,假设我将 case 更改为:

case image(value: Int)

如何使它符合 Decodable?

这是我的完整代码(不起作用)

let jsonData = """
{
    "count": 4
}
""".data(using: .utf8)!
        
        do {
            let decoder = JSONDecoder()
            let response = try decoder.decode(PostType.self, from: jsonData)
            
            print(response)
        } catch {
            print(error)
        }
    }
}

enum PostType: Int, Codable {
    case count = 4
}

另外,它将如何处理这样的枚举?

enum PostType: Decodable {
    case count(number: Int)
}



Best Answer-推荐答案


这很简单,只需使用隐式分配的 StringInt 原始值。

enum PostType: Int, Codable {
    case image, blob
}

image 编码为 0blob 编码为 1

或者

enum PostType: String, Codable {
    case image, blob
}

image 编码为 "image"blob 编码为 "blob"


这是一个如何使用它的简单示例:

enum PostType : Int, Codable {
    case count = 4
}

struct Post : Codable {
    var type : PostType
}

let jsonString = "{\"type\": 4}"

let jsonData = Data(jsonString.utf8)

do {
    let decoded = try JSONDecoder().decode(Post.self, from: jsonData)
    print("decoded:", decoded.type)
} catch {
    print(error)
}

更新

在 iOS 13.3+ 和 macOS 15.1+ 中,允许对 fragments 进行编码/解码 - 未包装在集合类型中的单个 JSON 值

let jsonString = "4"

let jsonData = Data(jsonString.utf8)
do {
    let decoded = try JSONDecoder().decode(PostType.self, from: jsonData)
    print("decoded:", decoded) // -> decoded: count
} catch {
    print(error)
}

在 Swift 5.5+ 中,甚至可以使用关联值对枚举进行 en-/decode,而无需任何额外代码。这些值被映射到一个字典,并且必须为每个关联的值指定一个参数标签

enum Rotation: Codable {
    case zAxis(angle: Double, speed: Int)
}

let jsonString = #"{"zAxis":{"angle":90,"speed":5}}"#

let jsonData = Data(jsonString.utf8)
do {
    let decoded = try JSONDecoder().decode(Rotation.self, from: jsonData)
    print("decoded:", decoded)
} catch {
    print(error)
}

关于swift - 如何在 Swift 中使枚举可解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950312/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap