Treasure
Treasure 是一组基于 Lyft 的 Mapper 库的工具,用于根据 JSON API 规范映射对象。如果您不使用 JSON API 规范,那么仅使用 Mapper 应该足够。
安装
使用 CocoaPods
use_frameworks!
pod "Treasure"
使用方法
Treasure 依赖于 Mapper。如果您不熟悉它,那么先查阅一下。
对象必须遵从 Resource
协议,该协议遵从 Mapper 的 Mappable
协议。
Key
提供方便的常量和函数,用于构建用于 Mapper 的字符串键。
关系由 ToOneRelationship
或 ToManyRelationship
表示。
可以使用关系映射包含的资源,这些资源被 Talent 接收并放入共享数据池中。
包含的资源不会被缓存,因此数据池将仅在当前生命周期中存在。
如果您将 Treasure.strictValidationOnInitialization
设置为 true
,则将验证传入的资源,如果不合法,初始化器将返回 nil
。验证错误将作为 DocumentValidationError
抛出,并打印到控制台。如果设置为 false
,则会抛出错误,但资源映射可能会成功。Treasure.strictValidationOnInitialization
默认设置为 false
。
import Treasure
struct Project: Resource {
let id: String
let type: String
let title: String
let manager: User?
init(map: TreasureMapper) throws {
id = try map.from(Key.id)
type = try map.from(Key.type)
title = try map.from(Key.attributes("title"))
let managerRelationship: ToOneRelationship? = try? map.from(Key.relationships("users"))
manager = try? map.from(managerRelationship)
}
}
您可以通过使用您收到的 JSON 实例化一个新 Treasure 来将其映射到您的对象上。
if let json = json as? [String: Any] {
let projects: [Project]? = Treasure(json: json)?.map()
}
您可以通过 Treasure 实例访问其他顶层 JSON API 对象。
if let json = json as? [String: Any] {
let treasure = Treasure(json: json)
let projects: [Project]? = treasure?.map()
guard projects != nil else {
print(treasure!.errors)
}
}
如果您想映射资源而不将数据添加到池中,可以使用 map
函数的静态版本。这只是一个便利包装器,它会在返回资源之前从锦囊中移除提供的 json。使用此函数不会让您访问其他顶层 JSON API 对象,因为它不会返回一个 Treasure
对象。
if let json = json as? [String: Any] {
let projects: [Project]? = Treasure.map(json: json)
}
您可以通过 jsonForResourceUpdateWith
和 jsonForResourceWith
静态函数构建用于更新或创建的 JSON API 资源。
这些函数将验证构建的资源,如果无效,将执行 assert(false)
。如果您按照以下过程创建 JSON,构建的资源应该是有效的。
let toOneRelationship = ToOneRelationship.jsonWith(key: "users", data: RelationshipData(type: "users", id: "4"))
let newProject = Treasure.jsonForResourceWith(type: "projects", attributes: ["title": "Test Project"], relationship: toOneRelationship)
上述调用将构建以下资源,您可以将它 POST 到您的后端服务进行创建。
"data": {
"type": "projects",
"attributes": {
"title": "Test Project"
},
"relationships": {
"users": {
"data": {
"type": "users",
"id": "4"
}
}
}
}
如果您想持久化数据池,可以使用 Treasure.chestData()
通过 Data
获取它,并使用 Treasure.store(data: Data)
恢复存储。
许可证
Treasure 在 MIT 许可下可用。更多信息请参阅 LICENSE 文件。
Lyft 的 Mapper 在 Apache 2.0 许可下可用。