解码多种可能类型的两种技巧:属性包装器

本文探讨了解决Swift中解码一个可能有多种类型的属性的两种技巧。第一种方法利用属性包装器,通过实现`Decodable`协议自定义解码过程,先尝试标准类型解码,如果失败再尝试其他类型。第二种方法则是通过定义自定义解码过程,使用枚举处理多种类型,虽然不够声明式,但在调用时需要根据业务选择合适类型的值。这两种方法都在实际代码中进行了展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Swift 的属性包装器是语法糖,

他可以让代码更加的声明式

定义属性的时候,把规则写进去

属性包装器, 主要使用 wrappedValue, 有时候用到 projectedValue

问题:

存在这样的一个结构体:

struct Figure: Decodable {
    var name: String
    var age: Int
}

后端传过来,一个 json,

要求 json 对应的内容,长这样,

能够解析出来

var dict: [String: Any] = ["name": "666", "age": 666]

json 对应的内容,长这样,

也可解析出来

dict = ["name": 666, "age": "666"]

问题,解码一个属性,他的数据可能有多种类型

技巧一,使用属性包装器

提供解码方法

static var losslessDecodableTypes:, 是一个解码方法的集合

系统提供的 LosslessStringConvertible 协议,可以让字符串,转值

public typealias LosslessStringCodable = LosslessStringConvertible & Codable



public struct LosslessDefaultStrategy<Value: LosslessStringCodable>{
    public static var losslessDecodableTypes: [(Decoder) -> LosslessStringCodable?] {
        @inline(__always)
        func decode<T: LosslessStringCodable>(_: T.Type) -> (Decoder) -> LosslessStringCodable? {
            return { try? T.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值