2014-10-03 88 views
1

我希望用戶上傳圖像,並且其他用戶將回復留給該圖像。到目前爲止一切正常,除非該特定圖像對象的行爲空,則應用程序崩潰。從空數組中檢索值

fatal error: unexpectedly found nil while unwrapping an Optional value 

這裏是我的代碼:

override func viewDidLoad() { 
    super.viewDidLoad() 

    var error = "" 

    var query = PFQuery(className:"Posts") 
    query.getObjectInBackgroundWithId(cellID) { 
     (objects: PFObject!, error: NSError!) -> Void in 
     if error == nil {  
      var array = objects.objectForKey("replies") as [String] // <- when error occurs the compiler point here. 
      for object in array { 
       self.repliesArray.append(object as String) 
      } 
     } else { 
      self.displayError("Error", error: "Error retreiving") 
     } 
     self.tableView.reloadData() 
    } 
} 

回答

0

工作的呢?您不能將空對象附加到數組,以便附加一個空字符串而不是null。你也需要解釋標記,以便它可以爲零。

var array = objects.objectForKey("replies") as [String!] 
for object in array { 
    if object != nil { 
     self.repliesArray.append(object as String) 
    } 
    else { 
     self.repliesArray.append("") 
    } 
} 
+0

發出安寧錯誤,嘗試了很多不同的If語句,但一直給我同樣的錯誤。 – Abdou023 2014-10-04 14:45:06

+0

@ Abdou023你會嘗試我更新的代碼嗎? – Dehli 2014-10-04 16:15:09

+0

錯誤:類型'NSString'不符合協議'NilLiteralConvertible' – Abdou023 2014-10-04 17:25:36

0
query.getObjectInBackgroundWithId(cellID) { 
    (objects: PFObject!, error: NSError!) -> Void in 
    if error == nil {  
     var array = objects.objectForKey("replies") as [String] // <- when error occurs the compiler point here. 

這裏的關鍵是,你要接受一個隱含展開可選(PFObject!),這是暗示一種承諾,它絕不會nil,但nil

理想情況下(*),類型應爲(objects: PFObject?, error: NSError?) -> Void,以使選項明確,並強制您執行需要的nil檢查。我相信你可以做到這一點,即使來電者聲稱向你發送(PFObject!, NSError!) -> Void,因爲我認爲Swift會爲你做隱式 - >顯式轉換。

如果這仍然不可能,那麼在使用它之前,您必須手動驗證objects不是nil。 (這是不同於@新德里的解決方案,它會檢查在objects包含的東西都是非nil這不是問題;問題是objects本身就是nil

(*)我說的「理想」這裏就現有的界面而言。傳遞可選值/錯誤的元組是一種糟糕的模式。更好的解決方案是使用類似Result object的東西。