测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | 2017年11月 |
SwiftSwift版本 | 3.0 |
SPM支持SPM | ✗ |
由CNKCQ维护。
对 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
变量用于深入 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文件。