Moya-ModelMapper 10.0.0

Moya-ModelMapper 10.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布日期最后发布日期2020年2月
SPM支持 SPM

Sunshinejr 维护。



Moya-ModelMapper

CocoaPods

ModelMapper 的用于 Moya 的绑定,以方便使用 RxSwiftReactiveCocoa 进行 JSON 序列化。

安装

CocoaPods

pod 'Moya-ModelMapper', '~> 10.0'

如果您想使用 RxSwift 的绑定,请使用相应的 subspec。

pod 'Moya-ModelMapper/RxSwift', '~> 10.0'

如果您想使用 ReactiveSwift 的绑定,请使用相应的 subspec。

pod 'Moya-ModelMapper/ReactiveSwift', '~> 10.0'

Carthage

在 Cartfile 中指定

github "sunshinejr/Moya-ModelMapper" ~> 10.0

Carthage 用户可以指向此仓库,并使用生成的任何框架,例如 Moya-ModelMapper、RxMoya-ModelMapper 或 ReactiveMoya-ModelMapper。

Swift 包管理器

将以下内容添加为 Package.swift 依赖项。

.package(url: "https://github.com/sunshinejr/Moya-ModelMapper.git", .upToNextMajor(from: "10.0.0"))

绑定可通过 Moya_ModelMapper 模块使用。如果您对反应式扩展感兴趣,请使用 ReactiveMoya_ModelMapperRxMoya_ModelMapper

使用方法

创建一个实现协议 Mappable 的模型结构体或类。

import Foundation
import Mapper

struct Repository: Mappable {

    let identifier: Int
    let language: String? // Optional property
    let url: String? // Optional property

    init(map: Mapper) throws {
        try identifier = map.from("id")
        language = map.optionalFrom("language")
        url = map.optionalFrom("url")
    }

}

然后你将拥有扩展 Moya 响应的方法。这些方法是

map(to:)
map(to:keyPath:)
compactMap(to:)
compactMap(to:keyPath)

当使用 map(to:) 尝试将整个响应数据映射到对象/数组时,使用 map(to:keyPath:) 可以指定响应中的嵌套对象以获取。例如 map(to: User.self, keyPath: "data.response.user") 将遍历数据字典,然后通过响应字典到用户字典,将其解析。compactMap 是数组 map 的一个变体,如果其中一个对象失败,它不会使整个操作失败,只会从数组中移除该对象。RxSwiftReactiveCocoa 扩展也都有所有这些方法,但 RxSwift 还有可选映射。请参阅下面的示例或 Demo 项目。

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

provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.request(GitHub.repos("mjacko")) { (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 = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.rx.request(GitHub.repo("Moya/Moya"))
    .map(to: User.self, keyPath: "owner")
    .subscribe { event in
        switch event {
        case .success(let user):
            print(user)
        case .error(let error):
            print(error)
        }
}

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

provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.rx.request(GitHub.repos("mjacko"))
    .mapOptional(to: [Repository].self)
    .subscribe { event in
        switch event {
        case .success(let repos):
            // Here we can have either nil or [Repository] object.
            print(repos)
        case .error(let error):
            print(error)
        }
}

3. ReactiveSwift

provider = MoyaProvider<GitHub>(endpointClosure: endpointClosure)
provider.reactive.request(GitHub.repos("mjacko"))
    .map(to: [Repository].self)
    .observeOn(UIScheduler())
    .start { event in
        switch event {
        case .value(let repos):
            print(repos)
        case .failed(let error):
            print(error)
        default: break
        }
}

作者

Sunshinejr, [email protected], @thesunshinejr

许可协议

Moya-ModelMapper采用MIT许可协议。更多信息请参阅LICENSE文件。