Swift:将JSON字符串移动到数组的简便方法

时间:2015-02-06 14:19:17

标签: ios json swift

我有一个项目,我必须从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原则的一种大蔑视,如果需要的话,通过乏味的打字需要永远改变它。我只是想知道什么是重构这个的好方法,因为我已经没有想法了。提前谢谢。

3 个答案:

答案 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
}