珍宝 0.2.3

珍宝 0.2.3

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2019年4月
SPM支持 SPM

Kevin Weber 维护。



珍宝 0.2.3

  • kfweber

Treasure

Treasure 是一组基于 Lyft 的 Mapper 库的工具,用于根据 JSON API 规范映射对象。如果您不使用 JSON API 规范,那么仅使用 Mapper 应该足够。

安装

使用 CocoaPods

use_frameworks!

pod "Treasure"

使用方法

Treasure 依赖于 Mapper。如果您不熟悉它,那么先查阅一下。

对象必须遵从 Resource 协议,该协议遵从 Mapper 的 Mappable 协议。

Key 提供方便的常量和函数,用于构建用于 Mapper 的字符串键。

关系由 ToOneRelationshipToManyRelationship 表示。

可以使用关系映射包含的资源,这些资源被 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)
}

您可以通过 jsonForResourceUpdateWithjsonForResourceWith 静态函数构建用于更新或创建的 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 许可下可用。