2017-07-06 133 views
0

我是新的Swift中,我有添加元素到數組的問題不能添加元素到數組

我試圖從JSON存儲6個對象到數組。但陣列是零。

我看到它添加到陣列時,我調試它,我不知道爲什麼在完成請求JSON後它爲零?

JSON:

[ 
    { 
     "amount": "20.0", 
     "date": "10/07/2016" 
    }, 
    { 
     "amount": "21.0", 
     "date": "11/07/2016" 
    }, 
    { 
     "amount": "16.0", 
     "date": "12/07/2016" 
    }, 
    { 
     "amount": "30.0", 
     "date": "13/07/2016" 
    }, 
    { 
     "amount": "50.0", 
     "date": "14/07/2016" 
    }, 
    { 
     "amount": "33.0", 
     "date": "15/07/2016" 
    } 
] 

服務:

class DownloadService { 
    static let instance = DownloadService() 
    //static var goldArray = [Gold]() 
    var goldArray = [Gold]() 
    func getData() { 
     Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in 
      if let objJson = response.result.value as! NSArray?{ 
       for element in objJson { 
        let data = element as! NSDictionary 
        let amount = data["amount"] as! String 
        let date = data["date"] as! String 
        let gold = Gold(amount: amount, date: date) 
        self.goldArray.append(gold) 
        print(self.goldArray.count)//print 1 to 6 
       } 
      } 
     } 
     printGoldArray() 
    } 

    func printGoldArray(){ 
     for element in self.goldArray { 
      print(element)//print nothing 
     } 
    } 
} 

黃金類:

class Gold{ 
    let amount:String 
    let date: String 

    init(amount: String, date: String) { 
     self.amount = amount 
     self.date = date 
    } 

} 

的ViewController:

class ViewController: UIViewController { 
    //var dataArray = [Gold]() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     DownloadService.instance.getData() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+0

這是因爲你錯過了異步概念。如果在'printGoldArray()'之前在'print(self.goldArray.count)'和'print(「print print」)''之前添加'print(「in alamofire closure」)'',你會看到打印不是你期望的。尋找「Swift + Closure + Async」。 – Larme

+1

爲什麼你**強制unwrap **一個可選的('as!NSArray?')的可選項? – vadian

回答

1

這裏printGoldArray功能正在從封閉外部調用,這意味着當printGoldArray被稱爲goldArray可能沒有任何值。

嘗試在添加值後從閉包內調用printGoldArray函數。試試下面的代碼

func getData() { 
    Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in 
     if let objJson = response.result.value as! NSArray?{ 
      for element in objJson { 
       let data = element as! NSDictionary 
       let amount = data["amount"] as! String 
       let date = data["date"] as! String 
       let gold = Gold(amount: amount, date: date) 
       self.goldArray.append(gold) 
       print(self.goldArray.count)//print 1 to 6 
      } 
     } 
    printGoldArray() 
    } 

} 
+0

其實,我的目的是在其他方法中使用goldArray [],所以我將它聲明爲全局變量,但直到無法獲取數據。那麼有什麼方法可以使用它? – KhanhNg

+0

你可以在函數getData()中使用閉包,並在其完成時關閉,你可以使用goldArray –

+0

我可以在func之外使用getData()嗎? – KhanhNg

0

您需要先獲得價值了

do{ 
    let json = try JSONSerialization.jsonObject(with: response.result.value, options: []) as? [Any] 
    let firstObj = json?[0] as! [String: String] 
    let amount = firstObj["amount"] 
    dump(amount) 
}catch let error{ 

} 

然後前解析您的JSON數據,直到執行關閉你的HTTP調用不會讓你的返回值。所以要打印你的數組,你需要在你的閉包中進行。例如,你可以在json解析後立即執行,通過調用printGoldArray()

0

首先,你的數組不是打印數組元素,因爲你在關閉後直接打印數組元素。封閉使用異步範例。所以把打印功能關閉。

第二件事是爲什麼使用到很大的力量完整unwrap。相反,您可以使用if letguard聲明

您可以在下面看到代碼。

func getData() { 
     Alamofire.request("https://rth-recruitment.herokuapp.com/api/prices/chart_data", headers: headers).responseJSON { response in 
      if let objJson = response.result.value as? NSArray { 
       for element in objJson { 
        if let data = element as? NSDictionary { 
         let amount = data["amount"] as! String 
         let date = data["date"] as! String 
         let gold = Gold(amount: amount, date: date) 
         self.goldArray.append(gold) 
         print(self.goldArray.count) 
        } 
       } 
      } 
      printGoldArray() 
     } 
    }