2016-01-26 42 views
0

我想要做一個GET請求,並將以下結果保存到NSMutuableArray。然後我試圖加載下面的數據到一個tableview中,但是當我嘗試配置行數時,我得到了「意外地發現了零,同時展開可選值」。意外地發現零,同時展開可選值,但有一些值

var dataArray:NSMutableArray? 

Alamofire.request(.GET, "SOMERANDOMWEBSITE") .responseJSON { response in 
     // using if-let syntax to save json into our NSMutuableArray 
     if let JSON = response.result.value { 
      self.dataArray = JSON as? NSMutableArray 
     } 
    } 

當我嘗試配置的行數:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 

    return self.dataArray.count 
} 

它給了我一個錯誤:「意外發現零而展開可選值」。但是,什麼是奇怪的是,當我創建一個隨機按鈕,看看是否.Count之間確實是零:

@IBAction func function(sender: AnyObject) { 
    print(self.dataArray?.count) 
} 

它返回我選購(2)而不是零。有任何想法嗎?

+0

什麼是response.result.value設置爲您的網絡電話後? – Devster101

回答

3

您將您的數組設置爲可選。我們可以看到,在這裏:

print(self.dataArray?.count) 

所以,直到它在Alamofire的關閉(網絡請求發生在後臺)上人口,它是零。

您引用:

return self.dataArray.count 

,但實際上你可能已經做了

return self.dataArray!.count 

這就是爲什麼它崩潰。

所以你必須聲明另一個計數選項,當它爲零。溶液可以是安全地解開該陣列然後返回計數或返回默認值:

if let array = self.dataArray { 
    return array.count 
} 
return 0 

此相同的邏輯可以在一個單一的線表示,爲@布賴恩鎳筆記評價:

return self.dataArray?.count ?? 0 

另外,正如@vadian在評論中所說的,絕對的,可選數組在這裏沒什麼意義,最好從一開始就有一個非可選的空數組。

+1

同樣,它可能是'return self.dataArray?.count ?? 0' –

+0

我已經添加了速記的答案,這是一個好主意。感謝您的建議。 – Moritz

+0

沒有冒犯,但可選的數據源數組是非常糟糕的做法。 – vadian

1

這並不奇怪,它是異步的。

最初,您聲明dataArray爲可選項(又名nil),但不要初始化它。

第一次嘗試更新表視圖失敗(崩潰),因爲nil上調用count是一個壞主意。

同時,異步請求方法返回數據並將其分配給dataArray,該數據現在具有(可選)值。

這就是爲什麼你在function得到結果。

解決方案是聲明和初始化數組作爲非可選的Swift類型。

var dataArray = [AnyObject]() 

有可能是一個更具體的類型比AnyObject

,並指定返回的數據相應鑄造結果爲「好」的類型。


基本上聲明表視圖數據源陣列作爲任選是荒謬因爲你的表視圖總是非可選的。

相關問題