CodableWrappers实战案例:如何处理API返回的非标准布尔值与数字类型
【免费下载链接】CodableWrappersA Collection of PropertyWrappers to make custom Serialization of Swift Codable Types easy项目地址: https://gitcode.com/gh_mirrors/co/CodableWrappers
在Swift开发中,处理API返回的非标准数据类型常常让开发者头疼,尤其是布尔值和数字类型的不规范格式。CodableWrappers作为一个强大的属性包装器集合,能轻松解决这些序列化难题,让自定义数据解析变得简单高效。
🤔 为什么需要处理非标准数据类型?
当你调用第三方API时,是否遇到过这些情况:
- 布尔值用"true"/"false"字符串或1/0数字表示
- 浮点数用"inf"表示无穷大,"NaN"表示非数字值
- 同一接口时而返回数字时而返回字符串
这些非标准格式会导致Codable解析失败,而CodableWrappers提供了优雅的解决方案。
🔍 非标准布尔值处理方案
1️⃣ 数字类型布尔值转换
CodableWrappers提供了BoolAsIntegerValueProvider,可以将数字类型(如Int)与Bool相互转换:
// 定义使用Int类型的布尔值包装器 typealias IntBoolCoding = NonConformingBoolCoding<BoolAsIntegerValueProvider<Int>> // 在模型中使用 struct UserResponse: Codable { @IntBoolCoding var isActive: Bool @IntBoolCoding var hasPermission: Bool }这个实现会将0解析为false,大于0的值解析为true,完美处理API返回的数字型布尔值。
2️⃣ 字符串类型布尔值转换
对于返回"true"/"false"字符串的API,可以使用BoolAsStringValueProvider:
// 定义使用String类型的布尔值包装器 typealias StringBoolCoding = NonConformingBoolCoding<BoolAsStringValueProvider> // 在模型中使用 struct SettingsResponse: Codable { @StringBoolCoding var notificationsEnabled: Bool @StringBoolCoding var darkModeEnabled: Bool }该实现会自动将字符串值转换为对应的布尔值,并且会忽略大小写,确保"True"、"TRUE"等变体都能正确解析。
🔢 非标准数字类型处理方案
1️⃣ 特殊浮点值处理
当API返回"inf"、"-inf"或"NaN"等特殊浮点值时,可以使用NonConformingFloatStaticCoder和NonConformingDoubleStaticCoder:
// 定义自定义值提供者 struct APIFloatingPointValueProvider: NonConformingDecimalValueProvider { static var positiveInfinity: String = "inf" static var negativeInfinity: String = "-inf" static var nan: String = "NaN" } // 创建包装器类型 typealias APIFloatCoding = CodingUses<NonConformingFloatStaticCoder<APIFloatingPointValueProvider>> typealias APIDoubleCoding = CodingUses<NonConformingDoubleStaticCoder<APIFloatingPointValueProvider>> // 在模型中使用 struct MeasurementResponse: Codable { @APIFloatCoding var temperature: Float @APIDoubleCoding var pressure: Double }这个实现会自动处理特殊浮点值,确保解析和编码过程不会抛出异常。
🚀 实际应用示例
假设我们有一个返回非标准数据的API,使用CodableWrappers可以这样处理:
struct ProductResponse: Codable { let id: Int let name: String // 处理数字布尔值 @NonConformingBoolCoding<BoolAsIntegerValueProvider<Int>> var isAvailable: Bool // 处理字符串布尔值 @NonConformingBoolCoding<BoolAsStringValueProvider> var isFeatured: Bool // 处理特殊浮点值 @CodingUses<NonConformingDoubleStaticCoder<APIFloatingPointValueProvider>> var rating: Double }📚 深入了解更多
CodableWrappers还提供了更多处理其他数据类型的工具:
- 日期格式化:StaticCoders/DateCoding.swift
- 数据处理:StaticCoders/DataCoding.swift
- 空值处理:Core/OptionalWrappers.swift
💻 开始使用
要在项目中使用CodableWrappers,只需将仓库克隆到本地:
git clone https://gitcode.com/gh_mirrors/co/CodableWrappers然后按照官方文档集成到你的Swift项目中,即可开始处理各种非标准API数据类型。
通过CodableWrappers,你可以告别繁琐的自定义编码/解码逻辑,用简洁优雅的方式处理各种非标准数据类型,让Swift Codable的使用体验提升到新的水平!
【免费下载链接】CodableWrappersA Collection of PropertyWrappers to make custom Serialization of Swift Codable Types easy项目地址: https://gitcode.com/gh_mirrors/co/CodableWrappers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考