2017-09-28 1 views
0

Ich versuche, etwas Mathe mit Benutzereingabe Zahlen, die ich von UITextFields bekommen. Das Problem, es könnte nichts in der TextField sein, in diesem Fall sollte der Wert auf Null gesetzt werden. Ich habe versucht, die Wache Aussage, aber es scheint, dass ich es falsch verwende:Versuchen zu vermeiden, find nil unwrapping optionale Werte

Was ist falsch mit diesem Code? Was soll ich ändern?

+0

zu überprüfen, ob es nichts mehr im Textfeld pflegt man bekommt Null. numberTextField.text ist ein leerer String "" –

+0

@RajeshkumarR Ich schaue mir die Dokumentation an, und 'UITextField's' text' -Eigenschaft ist optional. Ich weiß nicht * warum * es ist optional, aber es ist in der Dokumentation ... –

+0

@CharlesSrstka Ja. Die Texteigenschaft von UITextField ist optional. Aber Sie erhalten nie null, auch wenn Sie der Texteigenschaft null zuweisen. Also keine Notwendigkeit zu verwenden, wenn lassen oder Wache für das Auspacken des Textes. –

Antwort

4

Die Anweisung guard kann nicht verwendet werden, da Sie die Funktion beenden müssen, wenn die Bedingung false lautet. Stattdessen sollten Sie die ?? Operator verwenden:

let number = numberTextField.text.flatMap { Int($0) } ?? 0 

Warum flatMap? Weil wir die String in eine Int (oder eine Double, wenn diese einen Fließkommawert enthalten kann) umwandeln müssen, damit es den gleichen Typ wie die 0 hat. flatMap auf einem optionalen gibt den Wert innerhalb der Schließung zurück, wenn text nicht nil ist, aber nil zurückgibt, wenn es ist. In jedem Fall erhalten Sie eine optionale Int, die dann nicht optional ist, indem Sie den Standardwert 0 über den Operator ?? eingeben.

+1

FYI - "Wächter" erfordert, dass Sie den Block verlassen, in dem sich der Wächter befindet. Wenn sich der Wächter an der Spitze der Funktion befindet, bedeutet dies natürlich, dass Sie die Funktion verlassen müssen. Aber nicht alle Wachen sind an der Spitze einer Funktion. – rmaddy

0

Sie sollten einen Standardwert anstelle eines Wächters verwenden, um das von Ihnen gewünschte Verhalten zu erhalten.

let number = Double(numberTextField.text) ?? 0 
+0

Ich bin mir nicht sicher, warum dies abgelehnt wurde.Es scheint, als wäre es die richtige Lösung. Operator ?? ist das gleiche wie zu sagen "numberTextField.text! = nil? numberTextField.text!: 0" – DavidN

+0

Ich bin mir auch nicht sicher. – Blake

+0

Das Problem dabei ist, dass die Typen nicht übereinstimmen. Welcher Typ ist 'Nummer' nach der Ausführung dieses Codes? Ist es eine Nummer oder eine Zeichenfolge? – ryantxr

-1

Nichts bedeutet leere Zeichenfolge anstatt null „schützen lassen“ verwendet wird nil Wert

Lassen Sie versuchen, das Verfahren unter

if numberTextField.text.isEmpty { 
    let number = 0 
} 
Verwandte Themen