2016-08-12 53 views
-1

当我运行我的应用程序时,我得到了臭名昭着的错误:unexpectedly found nil while unwrapping an Optional value。我相信这是由于我的代码不一致,我似乎无法找到...Swift:帮助发现导致我的应用程序崩溃的不一致性

问题出现在4个地方中的任何一个。我的子类对象CustomMessage.swift,功能addMessagedidPressSendButtonobserveMessages

这里是我的子类的对象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") 
    } 
} 

这里是我已经提到的其他三个功能。请注意,所有这些一起工作。

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) 

     } 
    } 

我也试图做一些调试和代码不会崩溃,直到observeMessages()被调用,但即使如此,它运行(注意方法中我打印语句),但不会崩溃,直至线:

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

这使我相信,这个问题是由于不一致的地方这三个函数里面。我无法弄清楚它在哪里或是什么。

感谢您的帮助!

让我知道你是否需要任何额外的信息。

+0

重写你的代码没有!s,问题会变得更加明显。如果让,守卫让和使用可选的链接来代替。 –

+0

这并不能解决我的问题:( –

+0

我不确定你在乎的是@AaronBrager正确指出的,你有很多不安全的解包装在你的self.addMessage方法之上 – Shripada

回答

0

我推翻了这么多......在之前的测试中,我保存了没有我的新属性的对象,所以当应用程序试图调用旧数据的新属性时,Xcode会回应此错误消息。对我而言,这是愚蠢的。

+0

这就是为什么你应该解开包裹,并且不打开包装并妥善处理错误和意想不到的数据:) –