2016-05-06 13 views
0

So bin ich zu Swift sehr neu und dieses Tutorial wurde im Anschluss Dies war diese App zu machen https://www.youtube.com/watch?v=NJHsdjH2HdYeinen Rechner App erstellen

das erste Problem: currentNumber = currentNumber * 10 + Float (sender.titleLabel .text ! .toInt())

In den Kommentaren, sagte der Mann, um diese Linie zu ändern: currentNumber = currentNumber * 10 + Float (! Int (sender.titleLabel .text))

I tat dies und ich bekomme den Fehler: Thread 1: EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0)

+2

Aus diesem Grund missbrauchen Sie nicht den "force unwrap" -Operator (das '!'). Wenn Sie es verwenden, sagen Sie dem Compiler "Ich verstehe, dass dieser Wert, den ich will, ein optionales ist, und dass es" nil "sein könnte, aber nehme an, dass es nicht ist und mach es trotzdem weiter". Wenn Sie das Programm ausführen und der Wert sich als "Null" herausstellt, ist das Programm wie "Ich vertraute Ihnen :(" und wird traurig, dass Sie es belogen haben und letztendlich Selbstmord begangen haben. – Alexander

+0

Vielen Dank für Ihre Antwort , was ändere ich, um diesen Fehler zu vermeiden? – jimmythecat

+0

Nutzen Sie den Koaleszenzoperator nil, um Abstürze zu vermeiden: 'currentNumber = aktuelleNummer * 10 + Float (Int (sender.titleLabel? .text ??" ") ?? 0) ' – vacawama

Antwort

3

Wie in den Kommentaren gesagt, sollten Sie immer vermeiden, den "Crash Operator" (!) zu verwenden - und lernen, stattdessen mit optionalen Werten sicher umzugehen.

Ihr Programm abstürzt, weil entweder die titleLabel, text oder Int(...)nil sind - und Sie versuchen dann zu zwingen sie auszupacken. Dies könnte bedeuten, dass Ihre Schaltfläche keinen titleLabel hat oder dass der Text titleLabel nicht in eine Int konvertierbar ist.

Die Lösung besteht darin, sicher mit den Optionals umzugehen, wenn Sie auf sie stoßen. Es gibt viele Möglichkeiten, dies zu tun, aber ich verwende normalerweise eine oder mehrere guard-Anweisungen. Auf diese Weise können Sie optional ein optionales Objekt entfernen, wenn es einen Wert hat. Andernfalls wird der Code innerhalb der Klammern ausgeführt. Dies ist nützlich, wenn der zukünftige Code auf dem optionalen Gerät nil hängt. Zum Beispiel:

guard let buttonText = sender.titleLabel?.text else { 
    print("Sender didn't have either a titleLabel or text!") 
    return 
} 

guard let textAsInt = Int(buttonText) else { 
    print("Text wasn't convertible to an Int!") 
    return 
} 

currentNumber = currentNumber*10 + Float(textAsInt) 

Jetzt erhalten Sie hilfreich print Nachrichten statt Abstürze! Daher weißt du genau, was schief gelaufen ist und was du tun kannst, um es zu reparieren (wenn es repariert werden muss).

Sie könnten auch diese beiden Kontrollen in einem einzigen guard konsolidieren, wenn Sie prägnanter Code wollen, aber weniger präzise Fehler:

guard let buttonText = sender.titleLabel?.text, textAsInt = Int(buttonText) else { 
    print("Something went wrong when converting the button title to an Int!") 
    return 
} 

currentNumber = currentNumber*10 + Float(textAsInt) 

Oder Sie können flatMap verwenden, wenn Sie Verschlüsse wie:

guard let i = sender.titleLabel?.text.flatMap({Int($0)}) else { 
    print("Something went wrong when converting the button title to an Int!") 
    return 
} 

currentNumber = currentNumber*10 + Float(i) 

Die flatMap Option kann auf den ersten Blick ein bisschen komisch aussehen, aber alles, was es macht, ist der Versuch, die titleLabel 's text der Schaltfläche zu Int zu konvertieren. Wenn es fehlschlägt, gibt es nil zurück (die die guard abholen wird), andernfalls wird es den numerischen Wert des Texts zurückgeben.


Als @vacawama said in the comments, könnten Sie auch die Null Koaleszierstruktur Operator verwenden, um 0 in dem Fall zu verwenden, dass die titleLabel, text oder Int(...) sind nil:

currentNumber = currentNumber * 10 + Float(Int(sender.titleLabel?.text ?? "") ?? 0) 

tragen jedoch daran, dass dies könnte zu unerwartetem Verhalten führen. Ich vermute, dass Ihr Programm abstürzt, weil Ihre Logik für nicht numerische Schaltflächen ausgeführt wird, z. B. die Schaltfläche "+". Wenn dies der Fall ist, multiplizieren Sie Ihre Nummer mit 10 jedes Mal, wenn Sie eine nicht numerische Taste drücken.Sie müssen zuerst sicherstellen, dass Ihre Logik nur auf numerischen Tasten aufgerufen wird.

Obwohl ohne Ihren vollen Code zu sehen, ist es schwer zu sagen.


Für weitere Informationen darüber, wie mit optionals, um sicher zu umgehen, finden Sie in diesem extensive Q&A on the subject.

Verwandte Themen