2014-10-03 85 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的东西。