error fatal: inesperadamente encontrado nulo al desenvolver un valor opcional – Calculadora de Standford

Estoy viendo a los conferenciantes de Standford Swift en ItunesU y tengo algunos problemas para entender.

El conferenciante está clasificando una cadena en un doble en un punto. Lo hizo de la siguiente manera:

return NSNumberFormatter().numberFromString(display.text!)!.doubleValue 

display.text es un UILabel De todos modos, cuando lo hago así mi aplicación se bloquea y me sale el siguiente error:

 fatal error: unexpectedly found nil while unwrapping an Optional value 

Cuando clasifiqué la cadena de esta forma:

 (display.text! as NSString).doubleValue 

funciona bien.

Sé que debe haber una var opcional en cualquier lugar, pero no estoy en eso para decir lo que está mal en este momento. Estoy feliz por cada indicio.

El problema es su display.text no tiene un número válido en su text. Entonces regresará nada.

Entonces tu expresión se convertirá en:

 return nil!.doubleValue 

Y definitivamente se bloqueará.

Para convertir una String para double su segundo enfoque es más adecuado. Significa usar:

 (display.text! as NSString).doubleValue 

Es un mejor enfoque para este caso.


Referencia: NSNumberFormatter Class Reference

- numberFromString:

Devuelve un object NSNumber creado al analizar una cadena dada.

Declaración

Rápido

func numberFromString(_ string: String) -> NSNumber?

C objective

- (NSNumber *)numberFromString:(NSString *)string

Parámetros

string

Un object NSString que se analiza para generar el object de número devuelto.

Valor de retorno

Un object NSNumber creado al analizar la cadena utilizando el formatting del receptor. Devuelve nil si no hay numbers en la cadena pasada.

Discusión

Se ignoran los espacios principales de una cadena. Por ejemplo, las cadenas "5" y "5" se manejan de la misma manera.

Mika, acabo de descubrir por qué mi progtwig de calculadora se está estrellando con el mismo post de error que tú. Restring cuando creamos la tecla enter, todavía estaba "vinculada" a la function appendDigit y tuvimos que hacer clic / hacer clic con el button derecho para romper la connection. Estaba luchando contra el mismo problema que tú, y resultó que había copydo / pegado mis keys de operación y todas ellas estaban aún conectadas a la function appendDigit. Eso significaba que cada vez que presionaba la tecla "x", estaba enviando un no numérico a la function appendDigit, que cuando se desenvolvía equivalía a "nil". Espero que ayude. Wilton

En la primera forma, numberFromString devuelve nil si display.text no contiene un número.

Mi conjetura es que en este primer caso su display.text no se inicializa con un número. ¡Así que numberFromString devuelve un nil que está intentando desenvolver usando ! . Esto arroja el error.

En la segunda forma, está NSString como NSString no importa qué es el contenido (vacío, "1.0", "foo" …) y luego llamando a doubleValue que devolverá 0.0 si la cadena no comienza con un text válido ( diferente a un número). Esto no arroja un error, en el peor de los casos devolverá 0.0.

Actualmente estoy siguiendo las conferencias y me topé con el mismo problema. user3763062 y tuve el mismo problema: ambos accidentalmente dejamos la key enter limitada a la function appendDigit.

Eliminar la connection resolvió mi problema.

Bueno, supongo que estás aprendiendo la progtwigción Swift y haciendo tu primera calculadora. Si estoy en lo cierto, obtienes este locking porque olvidaste borrar un post que te envió el button Enter. En este caso, recibe un error porque el símbolo Enter no representa un número.

Me encontraba con el mismo problema cuando probé la aplicación en mi iPhone. El problema era el punto, para los numbers decimales. Mi región de iPhone se estableció en Rumania, donde usamos una coma para separar decimales y creo que el número FromString depende de la región cuando se realizan transformaciones. Después de cambiar la región a EE. UU., No apareció la exception nula.

Puede usar un molde condicional para Operador de coalescencia doble y nulo para asegurarse de que no devuelve nada como sigue:

 var myNumber = NSNumberFormatter().numberFromString("10.5") as? Double ?? 0 println(myNumber) // 10.5 myNumber = NSNumberFormatter().numberFromString("10") as? Double ?? 0 println(myNumber) // 10.0 myNumber = NSNumberFormatter().numberFromString("abc") as? Double ?? 0 println(myNumber) // 0.0 

Para mí, esto funciona:

 return Double(display.text!)!