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.