SerializedSwift 0.2.0

SerializedSwift 0.2.0

Dejan Skledar 维护。



  • Dejan Skledar

SerializedSwift

Swift Package Manager CocoaPods Platforms

使用@propertyWrappers 的 Swift 中的基于 GSON 的 JSON 解码策略。

特点

  • 无需编写自己的 init(from decoder: Decoder)
  • 无需编写自己的 CodingKeys 子类
  • 默认支持继承和组合
  • 自定义转换类
  • 备用编码键
  • 如果 JSON 键缺失,则使用默认值
struct Foo: Serializable {
    @Serialized
    var bar: String
    
    @Serialized("globalId")
    var id: String?
    
    @Serialized(alternateKey: "mobileNumber")
    var phoneNumber: String?
    
    @Serialized(default: 0)
    var score: Int
}

安装

Codoapods

将以下行添加到你的 Podfile

pod 'SerializedSwift'

Swift 包管理器

如果您使用 SPM 作为依赖项管理器,请将以下内容添加到您的 Package.swift 文件中的依赖项

dependencies: [
    .package(url: "https://github.com/dejanskledar/SerializedSwift.git")
]

要求

  • iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
  • Xcode 11+
  • Swift 5.1+

用法

class User: Serializable {

    @Serialized
    var name: String
    
    @Serialized("globalId")
    var id: String?
    
    @Serialized(alternateKey: "mobileNumber")
    var phoneNumber: String?
    
    @Serialized(default: 0)
    var score: Int
    
    required init() {}
}

与继承配合工作

不需要额外的解码逻辑

class PowerUser: User {
    @Serialized
    var powerName: String?

    @Serialized(default: 0)
    var credit: Int
}

与组合配合工作

不需要额外的解码逻辑

class ChatRoom: Serializable {
    @Serialized
    var admin: PowerUser?

    @Serialized(default: [])
    var users: [User]
}

自定义转换器类

您可以创建自己的自定义 Transformable 类,用于自定义转换逻辑。

class DateTransformer: Transformable {
    static func transformFromJSON(from value: String?) -> Date? {
        let formatter = DateFormatter()
        return formatter.date(from: value ?? "")
    }
    
    static func transformToJson(from value: Date?) -> String? {
        let formatter = DateFormatter()
        return formatter.string(from: value ?? Date())
    }
}

struct User: Serializable {
    @SerializedTransformable<DateTransformer>
    var birthDate: Date?
}

功能

Serializable

  • SerializableEncodableSerializableDecodable 类型别名中进行
  • 使用以下属性包装器进行自定义解码和编码
  • 将此协议与以下属性包装器结合用于您的类和结构体中

Serialized

  • 所有属性(可选和不可选)的序列化属性包装器
  • 自定义解码密钥
  • 默认情况下使用属性名称作为解码密钥
  • 支持替代解码密钥
  • 可选默认值(如果密钥缺失)。默认情况下,默认值是 nil。对于不可选属性,建议提供默认值,以避免崩溃
@Serialized("mainKey", alternativeKey: "backupKey", default: "")
var key: String?

SerializedTransformable

  • 自定义转换属性包装器
  • 创建自己的 Transformable 类
  • 将解码对象转换为自定义类型,如将自定义的 String 日期格式转换为原生的 Date
 class DateTransformer: Transformable {
     static func transformFromJSON(from value: String?) -> Date? {
         let formatter = DateFormatter()
         return formatter.date(from: value ?? "")
     }
     
     static func transformToJson(from value: Date?) -> String? {
         let formatter = DateFormatter()
         return formatter.string(from: value ?? "")
     }
 }

 // Usage of `SerializedTransformable`
 struct User: Serializable {
     @SerializedTransformable<DateTransformer>
     var birthDate: Date?
 } 

贡献

这仅仅是 Property Wrappers ability 的一小部分,以及如何改进 Swift 中的 JSON 解码和编码。欢迎合作。