Ответ 1
Здесь происходят две вещи (нравится нам это или нет): во-первых, существует Оператор
public func <<T : Comparable>(lhs: T?, rhs: T?) -> Bool
который сравнивает два варианта, если базовый тип сопоставим.
Поведение не задокументировано (насколько я знаю), но кажется, что
nil
aka Optional<T>.None
считается меньше всех не-nil
значения Optional<T>.Some(value)
.
Во-вторых, enum Optional
имеет конструктор
/// Construct a non-`nil` instance that stores `some`.
public init(_ some: Wrapped)
Теперь в
if x < 10 { ... }
lhs имеет тип Optional<Int>
. Единственный кандидат на <
оператор является вышеупомянутым, сравнивающим два варианта.
Следовательно, rhs выдается как необязательный, так что это
эквивалентно
if x < Optional<Int>.Some(10) { ... }
Update:
Эта функция была удалена в Swift 3 (SE-0121 - Удалить дополнительные операторы сравнения), и этот код больше не компилируется с Xcode 8 (в настоящее время бета-версия 6).