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