2015-02-06 60 views
1

我有一個項目,我必須從JSON對象中抽取一堆Logo URL和Title,然後使用Alamofire和SwiftyJSON來提取此類信息:Swift:將JSON字符串移動到數組的簡寫方式

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原則的一大忽視,並且如果需要,它將需要永久性地通過單調乏味的打字來改變它。我只是想知道什麼是重構這個的好方法,因爲我已經沒有想法了。提前致謝。

回答

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

可以使用減少這樣的任務:

var titles = jsonObj.reduce([] as [String]) { 
    p, n in 
    var temp = p 
    temp.append(n["title"]!) 
    return temp 
} 
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 
相關問題