Declaré una dirección de entidad de datos centrales con un atributo 'zip' de tipo Int16.

El problema es que cuando asigno un entero a ese atributo:

address?.zip = Int(zipField.text!)

Recibo un error que dice No se puede asignar el valor del tipo Int al tipo Int16. Tiene sentido (supongo).

El problema es que cuando intento transmitir ese int a un Int16, XCode todavía me explota:

let zip:Int? = Int(zipField.text!)
if zip != nil {
    let zip16 = Int16(zip!)
}

Es esa línea donde convierto el entero que hace que XCode se bloquee. Realmente no veo ninguna información en el mensaje de error, así que no estoy seguro de qué intentar.

En general, ¿debería usar Int64 debido al sistema operativo de estos teléfonos?

6
Daniel Thompson 7 mar. 2017 a las 03:52

2 respuestas

La mejor respuesta

Debe desterrar todos los ! s de su código. Eso solo le dice al compilador "colapsar aquí si hago algo mal":

if let str = zipField.text,
    let zip = Int16(str) {
    address?.zip = zip
}

Además, debe leer sobre la declaración guard de Swift porque no tiene sentido ejecutar ninguno de esos códigos si no tiene una dirección. Algo como:

guard let addr = address else { return }
addr.zip = 90210
10
Dave Weston 7 mar. 2017 a las 23:30

Puede utilizar:

address?.zip = Int16(zipField.text!)

Y en el documento de estructura Int16, sobre init?(String, radix: Int), hay la siguiente discusión:

Si el texto no coincide con la expresión regular "[+ -]? [0-9a-zA-Z] +", o el valor que indica en la raíz dada no es representable, el resultado es nulo.

Por lo tanto, debe asegurarse de que el texto sea válido para convertir.

1
LinShiwei 7 mar. 2017 a las 08:43