protocol extension swift optional

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.