Подтвердить что ты не робот

Swift nil имеет числовое значение?

Это действительный код в Swift:

println(nil < 1)

И результат будет правдой, аналогично

println(nil > 1)

будет ложным (число 1 произвольное, вы можете сделать то же самое для -1 и, возможно, что-то еще). Причина, по которой я спрашиваю, заключается в том, что я видел код, который пытался сравнить "some_string".toInt() с числовым значением и скомпилировал его, что кажется неправильным, если toInt() возвращает Int?.

Мой вопрос: должен ли это быть синтаксисом в Swift? Если да, то каково числовое значение nil?

Обновление Swift 3.0:

Похоже, что Swift Evolution решает эту проблему удаление необязательных операторов сравнения. Это уже не проблема в Swift 3.0, поскольку она не компилируется.

4b9b3361

Ответ 1

Я верю, что происходит то, что буквальный 1 неявно выводит тип Int? по сравнению с nil. Для тех, кто не привык к Свифт, я объясню немного дальше. Swift имеет концепцию "optionals", которая может иметь значение или быть nil. (Для тех, кто знаком с Haskell, это в основном монада Maybe.) Неправильно присваивать nil переменной, которая явно не указана как необязательная, поэтому let i: Int = nil будет отклонена компилятором. Это позволяет использовать несколько преимуществ, которые выходят за рамки этого ответа, и это довольно умный способ сделать это.

Однако здесь происходит буквальное 1 допустимое значение нескольких типов: Int, Int32, Int64, UInt32, UInt64 и т.д. и т.д. и т.д. И это также допустимое значение дополнительных версий этих типов: Int?, Int32? и т.д.

Поэтому, когда компилятор Swift видит сравнение между литеральным значением и nil, он пытается найти тип, для которого оба эти значения будут действительны. 1 является допустимым значением типа Int?, а nil также является допустимым значением типа Int?, поэтому он применяет оператор сравнения с сигнатурой типа (Int?, Int?) -> Bool. (Это оператор сравнения, который принимает два значения Int? и возвращает a Bool). Эти правила оператора говорят, что значения nil сортируются ниже, чем что-либо еще, даже Int.min, и поэтому вы получаете результат, увиденный в вопросе OP.