MoyaModelMapper 1.0.2

MoyaModelMapper 1.0.2

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

Gustavo Perdomo 维护。



  • 作者:
  • Gustavo Perdomo

MoyaModelMapper

ModelMapperMoya 提供了模型映射功能,这样就更容易进行 JSON 序列化。还包含 RxSwiftReactiveSwift 的映射。

安装

使用方法

创建一个实现协议 Mappable 的 model 结构体或类。有关模型创建的更多详情请参阅这里

import Foundation
import Mapper

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

    init(map: Mapper) throws {
        try identifier = map.from("id")
        try name = map.from("name")
        try fullName = map.from("full_name")
        language = map.optionalFrom("language") // Optional property
    }
}

然后,您有了扩展 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)

请参阅以下示例或 Demo 项目中的示例。

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
        }
    }

示例项目

在 Demo 目录中有一个示例项目。要使用它,请运行 pod install 来下载必需的库。祝您玩得开心!

其他映射器

贡献

嗨!喜欢 MoyaModelMapper 吗?太棒了!我们实际上非常需要您的帮助!

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

  • 查找(并报告!)错误。
  • 新功能建议。
  • 回答问题。
  • 改进文档。
  • 审查拉取请求。
  • 帮助管理问题优先级。
  • 修复错误/新增功能。

如果您对此有任何兴趣,请发送拉取请求!贡献几次后,我们将让您成为仓库管理员,以便您可以合并拉取请求并帮助引领项目。🚢

许可证

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