extension - ¿Swift nil tiene un valor numérico?
swift syntax (1)
Este es un código válido en Swift:
println(nil < 1)
Y la salida será verdad, igualmente.
println(nil > 1)
será falso (el número 1 es arbitrario, puedes hacer lo mismo para -1 y probablemente otra cosa). La razón por la que pregunto es porque vi un código que intentó comparar "some_string".toInt()
con un valor numérico y compiló, lo que parece incorrecto si consideramos que toInt()
devuelve Int?
.
Mi pregunta es, ¿debería ser esta sintaxis válida en Swift? Si es así, ¿cuál es el valor numérico de nil?
Actualización Swift 3.0:
Parece que Swift Evolution abordó este problema eliminando los operadores de comparación opcionales . Esto ya no es un problema en Swift 3.0 ya que no se compila.
Creo que lo que está sucediendo es que el literal 1
se está encasillando implícitamente al Int?
tipo por la comparación a nil
. Para aquellos que no están acostumbrados a Swift, les explicaré un poco más. Swift tiene un concepto llamado "opcionales", que puede tener un valor o ser nil
. (Para cualquier persona que esté familiarizada con Haskell, esta es básicamente la mónada Maybe
.) Es ilegal asignar nil
a una variable que no se definió explícitamente como opcional, por lo tanto, el compilador rechazará let i: Int = nil
. Esto permite varios beneficios que están fuera del alcance de esta respuesta, y es una forma bastante inteligente de hacerlo.
Sin embargo, lo que sucede aquí es que el literal 1
es un valor válido de varios tipos: Int
, Int32
, Int64
, UInt32
, UInt64
, etc., etc., y también es un valor válido de las versiones opcionales de esos tipos. : Int?
, Int32?
, etc.
Entonces, cuando el compilador Swift ve una comparación entre un valor literal y nil
, intenta encontrar un tipo para el que ambos valores serían válidos. 1
es un valor válido del Int?
type, y nil
es también un valor válido de Int?
type, por lo que aplica el operador de comparación con la firma de tipo (Int?, Int?) -> Bool
. (Ese es el operador de comparación que toma dos valores Int?
Y devuelve un Bool
). Las reglas de ese operador dicen que los valores nil
se clasifican por debajo de cualquier otra cosa, incluso Int.min
, y así obtiene el resultado visto en la pregunta del OP.