2014-10-03 5 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

ли эта работа? Вы не можете добавлять нулевые объекты к массиву, чтобы это добавляло пустую строку вместо нуля. Также вам нужен знак объяснения, чтобы он мог быть нулем.

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

Дает ошибку ann, пробовал так много разных операторов If, но продолжал давать мне ту же ошибку. – Abdou023

+0

@ Abdou023 Вы бы попробовали мой обновленный код? – Dehli

+0

Ошибка: тип 'NSString' не соответствует протоколу 'NilLiteralConvertible' – Abdou023

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.

Смежные вопросы