AlamofireCodable 0.1.1

AlamofireCodable 0.1.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年11月
SwiftSwift版本3.0
SPM支持SPM

CNKCQ维护。



AlamofireCodable

CI Status
Version
License
Platform

Alamofire 的扩展,它使用 Codable 将 JSON 响应数据自动转换为 Swift 对象。
此项目深受流行的AlamofireObjectMapper 启发。

安装

可以使用 CocoaPods 通过将以下行添加到您的 Podfile 中将 AlamofireCodable 添加到您的项目

pod 'AlamofireCodable'

示例

要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install

需求

Xcode 9+ , Swift 4+

用法

给定一个返回天气数据的以下形式的 URL

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

您可以使用扩展按如下方式使用

import AlamofireCodable

        let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseObject(keyPath: "data",completionHandler: { (response: DataResponse<Weather>) in
                switch response.result {
                case .success(let object):
                    debugPrint("🌹", object.location)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

completion handler 中的 Weather 对象是您定义的自定义对象。唯一的要求是该对象必须符合 Codable 协议。在上面的例子中,Weather 对象看起来如下

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

该扩展使用泛型来允许您创建自己的自定义响应对象。以下是对 responseObject 函数的定义。只需将 T 中的您的自定义响应对象替换到 completion handler 中,扩展会处理其余的

public func responseObject<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil,  completionHandler: @escaping (DataResponse<T>) -> Void) -> Self 

responseObject 函数有 2 个可选参数和一个必需的 completion handler

  • queue: completion handler 分发的队列。
  • keyPath: 应执行对象映射的 JSON 的键路径
  • completionHandler: 一个闭包,一旦请求完成并且数据由 JSONDecoder 解码,就会执行。

轻松解码嵌套对象

AlamofireCodable 支持键中的点表示法,以便于映射嵌套对象。给定以下 JSON 字符串

{  
   "data":{  
      "location":"Toronto, Canada",
      "three_day_forecast":[  
         {  
            "conditions":"Partly cloudy",
            "day":"Monday",
            "temperature":20
         },
         {  
            "conditions":"Showers",
            "day":"Tuesday",
            "temperature":22
         },
         {  
            "conditions":"Sunny",
            "day":"Wednesday",
            "temperature":28
         }
      ]
   }
}

您可以按如下方式访问嵌套对象

      let form = WeatherForm()
        Alamofire.request(
            form.url,
            method: HTTPMethod.get,
            parameters: form.parameters(),
            encoding: form.encoding(),
            headers: form.headers()
            )
            .responseObject(completionHandler: { (response: DataResponse<RootModel>) in
                switch response.result {
                case .success(let root):
                    debugPrint("🌹", root)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

KeyPath

keyPath 变量用于深入 JSON 响应,并且只映射在该 keyPath 上找到的数据。它支持嵌套值,如 data.three_day_forecast,以在 JSON 响应中深入几个级别。

let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseArray(keyPath: "data.three_day_forecast", completionHandler: { (response: DataResponse<[Forecast]>) in
                switch response.result {
                case .success(let array):
                    debugPrint("🌹", array)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

数组响应

如果您有一个以 Array 形式返回数据的端点,您可以按以下函数映射它

public func responseArray<T: Codable>(queue: DispatchQueue? = nil, keyPath: String? = nil, completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self 

例如,如果您的端点返回以下内容

[
    { 
        "conditions": "Partly cloudy",
        "day" : "Monday",
        "temperature": 20 
    },
    { 
        "conditions": "Showers",
        "day" : "Tuesday",
        "temperature": 22 
    },
    { 
        "conditions": "Sunny",
        "day" : "Wednesday",
        "temperature": 28 
    }
]

您可以如此请求和映射它

        let form = WeatherForm()
        Alamofire.request(
                form.url,
                method: HTTPMethod.get,
                parameters: form.parameters(),
                encoding: form.encoding(),
                headers: form.headers()
            )
            .responseArray(keyPath: "data.three_day_forecast", completionHandler: { (response: DataResponse<[Forecast]>) in
                switch response.result {
                case .success(let array):
                    debugPrint("🌹", array)
                case .failure(let error):
                    debugPrint("🌹", error.localizedDescription)
                }
            })

作者

[email protected][email protected]

许可证

AlamofireCodable 按照MIT许可协议提供。更多信息请参阅LICENSE文件。