MoyaUnbox 1.0.0

MoyaUnbox 1.0.0

测试测试
语言语言 SwiftSwift
许可证 MIT
发布时间最后发布2017年3月
Swift 版本Swift 版本3.0
SPM支持 SPM

Gustavo Perdomo 维护。



MoyaUnbox 1.0.0

  • Gustavo Perdomo

MoyaUnbox

UnboxMoya 提供了绑定,以便更容易进行 JSON 序列化。还包括 RxSwiftReactiveSwift 绑定。

安装

使用

创建一个模型结构体或类。它需要实现协议 Unboxable。有关模型创建的更多详细信息,请参阅 这里

import Foundation
import Unbox

struct Repository: Unboxable {
    let identifier: Int
    let name: String
    let fullName: String
    let language: String? // Optional property

    init(unboxer: Unboxer) throws {
        identifier = try unboxer.unbox(key: "id")
        name = try unboxer.unbox(key: "name")
        fullName = try unboxer.unbox(key: "full_name")
        language = unboxer.unbox(key: "language")
    }
}

然后您将拥有扩展 Moya 响应的方法。这些方法包括:

map(to: type) // map object
map(to: type, fromKey: key) // map object
map(to: [type]) // map array of objects
map(to: [type], fromKey: key) // map array of objects

当使用 map(to: type) 尝试将整个响应数据映射到对象时,使用 map(to: type, fromKey: key) 您可以指定响应中的嵌套对象进行检索。例如,map(to: type, fromKey: "data.response.user") 会遍历数据的字典,然后是响应的字典,再到用户的字典,并将其解析。

对于 RxSwiftReactiveSwift,还提供了可选映射的方法。这些方法包括:

mapOptional(to: type)
mapOptional(to: type, fromKey: key)
mapOptional(to: [type])
mapOptional(to: [type], fromKey: key)

请参阅下面的示例或在示例项目中。

1. 正常使用(无 RxSwift 或 ReactiveSwift)

provider = MoyaProvider<GitHub>()
provider.request(GitHub.repos(username: "gperdomor")) { (result) in
    if case .success(let response) = result {
        do {
            let repos = try response.map(to: [Repository.self])
            print(repos)
        } catch Error.jsonMapping(let error) {
            print(try? error.mapString())
        } catch {
            print(":(")
        }
    }
}

2. RxSwift

provider = RxMoyaProvider<GitHub>()
provider.request(GitHub.repo(fullName: "gperdomor/sygnaler"))
        .map(to: Repository.self)
        .subscribe { event in
            switch event {
            case .next(let repo):
                print(repo)
            case .error(let error):
                print(error)
            default: break
            }
        }

此外,RxSwift 模块包含了可选映射。这意味着如果映射失败,映射器不会抛出错误,而是返回 nil。例如

provider = RxMoyaProvider<GitHub>()
provider
    .request(GitHub.repos(username: "gperdomor"))
    .mapOptional(to: [Repository.self])
    .subscribe { event in
        switch event {
        case .next(let repos):
            // Here we can have either nil or [Repository] object.
            print(repos)
        case .error(let error):
            print(error)
        default: break
        }
    }

3. ReactiveSwift

provider = ReactiveSwiftMoyaProvider<GitHub>()
provider
    .request(GitHub.repos(username: "gperdomor"))
    .map(to: [Repository.self])
    .start { event in
        switch event {
        case .value(let repos):
            print(repos)
        case .failed(let error):
            print(error)
        default: break
        }
    }

此外,ReactiveSwift 模块包含了可选映射。这意味着如果映射失败,映射器不会抛出错误,而是返回 nil。例如

provider = ReactiveSwiftMoyaProvider<GitHub>()
provider
    .request(GitHub.repos(username: "gperdomor"))
    .mapOptional(to: [Repository.self])
    .start { event in
        switch event {
        case .value(let repos):
            // Here we can have either nil or [Repository] object.
            print(repos)
        case .failed(let error):
            print(error)
        default: break
        }
    }

示例项目

示例目录中有示例项目。要使用它,运行 pod install 下载所需的库。祝您玩得开心!

其他映射器

贡献

嘿!喜欢MoyaUnbox吗?太棒了!我们实际上真的需要您的帮助!

开源不仅仅是编写代码。MoyaUnbox需要在以下方面得到您的帮助

  • 寻找(并报告!)错误。
  • 提出新功能建议。
  • 回答关于问题的疑问。
  • 改进文档。
  • 评审合并请求。
  • 帮助管理问题优先级。
  • 修复错误/新功能。

如果您觉得这些很酷,请发送合并请求!贡献几次之后,我们会将您设为存储库管理员,以便您可以合并合并请求并帮助掌舵🚢

许可

MoyaUnbox可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。