Ответ 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.