AlamofireCodable简介

AlamofireCodable:Alamofire的扩展,可使用Codable自动将JSON响应数据转换为快速对象。 该项目受到流行的AlamofireObjectMapper的极大启发。

安装

通过将以下行添加到Podfile中,可以使用CocoaPods将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
}
]
}
}

您可以按以下方式使用扩展名:

 进口AlamofireCodable 
 让表格= WeatherForm() 
Alamofire.request(
form.url,
方法:HTTPMethod.get,
参数:form.parameters(),
编码:form.encoding(),
标头:form.headers()

.responseObject(keyPath:“ data”,completionHandler:{(响应:DataResponse )在
切换response.result {
案例。成功(让对象):
debugPrint(“🌹”,object.location)
案例。失败(让错误):
debugPrint(“🌹”,error.localizedDescription)
}
})

完成处理程序中的Weather对象是您定义的自定义对象。 唯一的要求是对象必须符合Codable协议。 在上面的示例中, Weather对象如下所示:

  { 
“数据”:{
“位置”:“加拿大多伦多”,
“ three_day_forecast”:[
{
“条件”:“部分多云”,
“ day”:“星期一”,
“温度”:20
},
{
“ conditions”:“ Showers”,
“ day”:“星期二”,
“温度”:22
},
{
“ conditions”:“晴天”,
“ day”:“星期三”,
“温度”:28
}
]
}
}

该扩展使用泛型允许您创建自己的自定义响应对象。 以下是responseObject函数定义。 只需用您的自定义响应对象替换完成处理器中的T ,扩展即可处理其余的内容:

 公共函数responseObject (队列:DispatchQueue?= nil,keyPath:String?= nil,completionHandler:@转义(DataResponse )-> Void)-> Self 

responseObject函数具有2个可选参数和一个必需的completionHandler:

  • queue :分派完成处理程序的队列。
  • keyPath :应该执行对象映射的JSON的密钥路径
  • completeHandler:请求结束并且JSONDecoder解码了数据后将执行的闭包。

轻松解码嵌套对象

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

  { 
“数据”:{
“位置”:“加拿大多伦多”,
“ three_day_forecast”:[
{
“条件”:“部分多云”,
“ day”:“星期一”,
“温度”:20
},
{
“ conditions”:“ Showers”,
“ day”:“星期二”,
“温度”:22
},
{
“ conditions”:“晴天”,
“ day”:“星期三”,
“温度”:28
}
]
}
}

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

 让表格= WeatherForm() 
Alamofire.request(
form.url,
方法:HTTPMethod.get,
参数:form.parameters(),
编码:form.encoding(),
标头:form.headers()

.responseObject(completionHandler:{(响应:DataResponse )在
切换response.result {
大小写.success(let root):
debugPrint(“🌹”,根)
案例。失败(让错误):
debugPrint(“🌹”,error.localizedDescription)
}
})

关键路径

keyPath变量用于向下钻取JSON响应,并且仅映射在该keyPath找到的数据。 它支持诸如data.three_day_forecast嵌套值,以在JSON响应中向下钻取多个级别。

 让表格= WeatherForm() 
Alamofire.request(
form.url,
方法:HTTPMethod.get,
参数:form.parameters(),
编码:form.encoding(),
标头:form.headers()

.responseArray(keyPath:“ data.three_day_forecast”,completeHandler:{(响应:DataResponse )
切换response.result {
大小写.success(let array):
debugPrint(“🌹”,数组)
案例。失败(让错误):
debugPrint(“🌹”,error.localizedDescription)
}
})

数组响应

如果您有一个端点以Array形式返回数据,则可以使用以下函数将其映射:

 公共函数responseArray (队列:DispatchQueue?= nil,keyPath:String?= nil,completionHandler:@转义(DataResponse )-> Void)-> Self 

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

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

您可以请求并映射它,如下所示:

 让表格= WeatherForm() 
Alamofire.request(
form.url,
方法:HTTPMethod.get,
参数:form.parameters(),
编码:form.encoding(),
标头:form.headers()

.responseArray(keyPath:“ data.three_day_forecast”,completeHandler:{(响应:DataResponse )
切换response.result {
大小写.success(let array):
debugPrint(“🌹”,数组)
案例。失败(让错误):
debugPrint(“🌹”,error.localizedDescription)
}
})