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.
Schreiben Sie Ihren Code ohne die! S und das Problem wird deutlicher. Verwenden Sie stattdessen let, guard let und optional chaining. –
Das löst nicht mein Problem :( –
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