CodableMapper 是一个 Swift 微型库,它提供了一个接口(通过属性包装器),用于为 Codable
结构体中的各个属性定义自定义映射器。
此包中提供了三个属性包装器:DecodableMapper
、EncodableMapper
和 CodableMapper
;这些类似于 Decodable
、Encodable
和 Codable
协议的工作方式,其中最后一个是前两个协议的组合。
要使用 DecodableMapper
,您必须指定一个符合 DecodableMapperProvider
的类/结构体,它基本上包含一个静态方法,用于将原始 Data 中的值映射到特定的值。 类似这样:
struct Person: Decodable {
...
@DecodableMapper<CustomDateProvider>
var dateOfBirth: Date
...
}
请注意,您仍然需要使 Person
结构体符合 Decodable
,否则您将无法解码它(只是以防万一不太明显 😅)
类似地,您可以使用 EncodableMapper
,您必须使用符合 EncodableMapperProvider
的类/结构体来专门化它,它执行相反的映射(从特定的值到原始 Data)
struct Person: Encodable {
...
@EncodableMapper<CustomDateProvider>
var dateOfBirth: Date
...
}
同样,Person
结构体必须符合 Encodable
。
最后,我们有 CodableMapper
,它类似于 Codable
,其中映射器提供程序必须同时符合 DecodableMapperProvider
和 EncodableMapperProvider
。 用法与之前的类似
struct Person: Codable {
...
@CodableMapper<CustomDateProvider>
var dateOfBirth: Date
...
}
请注意,您必须为可选值和非可选值指定不同的提供程序,即使使用的映射是相同的,遗憾的是我找不到一种很好的方法来重用它们,所以如果您有任何想法,请随时打开 PR 😊
struct Person: Codable {
...
@CodableMapper<ISODateProvider>
var dateAdded: Date
@CodableMapper<OptionalISODateProvider>
var lastUpdated: Date?
...
}
您可以查看此仓库中的 Tests,以了解 CodableMapper
属性包装器在实践中如何工作,以及如何定义您自己的映射器提供程序。
使用 Swift Package Manager
将 CodableMapper 作为依赖项添加到您的 Package.swift
文件中。 有关更多信息,请参阅 Swift Package Manager 文档。
.package(url: "https://github.com/rkreutz/CodableMapper", from: "1.0.0")
CodableMapper
进行一些更改,请打开一个 PR。