2016-08-12 1 views
-1

Wenn ich meine App starte, bekomme ich den berüchtigten Fehler: unexpectedly found nil while unwrapping an Optional value. Ich glaube, das liegt an Inkonsistenzen in meinem Code, die ich nicht finden kann ...Swift: Hilfe zum Finden von Inkonsistenzen, die meine App zum Absturz bringen

Das Problem ist in einer von 4 Orten. Mein subclassed Objekt CustomMessage.swift, die Funktion addMessage, didPressSendButton oder observeMessages

Hier ist mein Unterklasse Objekt CustomMessage:

class CustomMessage: JSQMessage { 
    var score : Int 

    init(senderId: String, displayName: String, text: String, date: NSDate, score: Int) { 
     self.score = score 
     // super.init(senderId:senderId, displayName:displayName, text:text) // Must call a designated initializer of the superclass 'JSQMessage' 
     //super.init(senderId: senderId, displayName: displayName, text: text) 
     super.init(senderId: senderId, senderDisplayName: displayName, date: date, text: text) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Und hier sind die anderen drei Funktionen, die ich erwähnt hatte. Beachten Sie, dass alle diese zusammenarbeiten.

func addMessage(id: String, text: String, displayName: String, date: NSDate, score: Int) { 

     // Make sure the character count is between 10 and 140, then add message to message list to display 
     if (text.characters.count <= 10 || text.characters.count >= 140) { 

     } 
     else { 
      // let message = JSQMessage(senderId: id, displayName: displayName, text: text) 
      let message = CustomMessage(senderId: id, displayName: displayName, text: text, date: date, score: score) 
      messages.append(message) 
     } 

    } 

    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, 
          senderDisplayName: String!, date: NSDate!) { 

     // Make sure the character count is between 10 and 140, then save data to Firebase 
     if (text.characters.count <= 10 || text.characters.count >= 140) { 
      print("Your text must be between 10 and 140 characters") 
     } 
     else { 
      let itemRef = messageRef.childByAutoId() // 1 
      let messageItem = [ // 2 
       "text": text, 
       "senderId": senderId, 
       "location": getLocation(), 
       "date": String(date), 
       "score": getScore() 
      ] 
      itemRef.setValue(messageItem) // 3 

      // 4 
      JSQSystemSoundPlayer.jsq_playMessageSentSound() 

      // 5 

      finishSendingMessage() 

      Answers.logCustomEventWithName("Message sent", customAttributes: nil) 
     } 

    } 

    private func observeMessages() { 

     print("gets here") 

     // 1 
     let messagesQuery = messageRef.queryLimitedToLast(25) 
     // 2 
     messagesQuery.observeEventType(.ChildAdded) { (snapshot: FIRDataSnapshot!) in 
      // 3 
      print("gets inside") 

      let id = snapshot.value!["senderId"] as! String 
      let text = snapshot.value!["text"] as! String 
      let locationId = snapshot.value!["location"] as! String 
      let textScore = snapshot.value!["score"] as! NSInteger 
      let date = NSDate() 

      // 4 
      self.addMessage(id, text: text, displayName: locationId, date: date, score: textScore) 

      print("finished adding messages") 

      // 5 
      self.finishReceivingMessage() 

      Answers.logCustomEventWithName("Visited RoastChat", customAttributes: nil) 

     } 
    } 

Auch habe ich versucht, einige Debug zu tun, und der Code nicht abstürzt, bis observeMessages() aufgerufen wird, sondern auch dann läuft er (mein print-Anweisungen Hinweis innerhalb des Verfahrens), aber nicht bis zur Linie abstürzen :

self.addMessage(id, text: text, displayName: locationId, date: date, score: textScore)

Was mich zu der Annahme führt, dass das Problem aufgrund einer Inkonsistenz ist irgendwo innerhalb dieser drei Funktionen. Ich kann einfach nicht herausfinden, wo oder was es ist.

Danke für jede Hilfe!

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

Schreiben Sie Ihren Code ohne die! S und das Problem wird deutlicher. Verwenden Sie stattdessen let, guard let und optional chaining. –

+0

Das löst nicht mein Problem :( –

+0

Ich bin nicht sicher, dass Sie sich interessieren, was @AaronBrager zu Recht hingewiesen, Sie haben eine * Menge * von unsicheren Auspacken über Ihre Selbst.addMessage-Methoden – Shripada

Antwort

0

Ich überlegte das so sehr ... Während vorheriger Tests hatte ich Objekte ohne meine neuen Eigenschaften gespeichert, also, als die App versuchte, die neuen Eigenschaften auf meinen alten Daten aufzurufen, reagierte Xcode mit dieser Fehlermeldung. So dumm von meiner Seite.

+0

Deshalb sollten Sie ohne Kraftauspacken auspacken und Fehler und unerwartete Daten anmutig behandeln :) –

Verwandte Themen