我有一个项目,我必须从JSON对象中获取一堆徽标URL和标题,然后我使用Alamofire和SwiftyJSON来提取这些信息,如下所示:
Alamofire.request(.POST, postJsonURL, parameters: postParameters, encoding: .JSON).responseJSON {
(request, response, json, error) -> Void in
if (json != nil) {
var jsonObj = JSON(json!)
var title1 = jsonObj[0]["title"].stringValue
var title2 = jsonObj[1]["title"].stringValue
var title3 = jsonObj[2]["title"].stringValue
var title4 = jsonObj[3]["title"].stringValue
var title5 = jsonObj[4]["title"].stringValue
var image1 = jsonObj[0]["logoURL"].stringValue
var image2 = jsonObj[1]["logoURL"].stringValue
var image3 = jsonObj[2]["logoURL"].stringValue
var image4 = jsonObj[3]["logoURL"].stringValue
var image5 = jsonObj[4]["logoURL"].stringValue
self.images = [image1, image2, image3, image4, image5]
self.titles = [title1, title2, title3, title4, title5]
}
}
这在一定程度上起作用,但它让我很生气,因为它是对DRY原则的一种大蔑视,如果需要的话,通过乏味的打字需要永远改变它。我只是想知道什么是重构这个的好方法,因为我已经没有想法了。提前谢谢。
答案 0 :(得分:2)
只需使用循环:
Alamofire.request(.POST, postJsonURL, parameters: postParameters, encoding: .JSON).responseJSON {
(request, response, json, error) -> Void in
if (json != nil) {
var jsonObj = JSON(json!)
self.images = []
self.titles = []
for (var i=0; i < 5; ++i) {
self.images.append(jsonObj[i]["logoURL"].stringValue)
self.titles.append(jsonObj[i]["title"].stringValue)
}
}
}
答案 1 :(得分:2)
如果您想收集所有(不是0...4
)元素,只需迭代jsonObj
:
var jsonObj = JSON(json!)
var images:[String]
var titles:[String]
for (idx, obj) in jsonObj {
titles.append(obj["title"].stringValue)
images.append(obj["logoURL"].stringValue)
}
self.images = images
self.titles = titles
答案 2 :(得分:1)
您可以将reduce用于以下任务:
var titles = jsonObj.reduce([] as [String]) {
p, n in
var temp = p
temp.append(n["title"]!)
return temp
}