Операторы Swift и nil

Каково объяснение этого поведения?

let x: Int? = nil
if x < 10 {
    print("x < 10")
}

Он печатает "x < 10". Должно ли это вызывать ошибку времени выполнения или, по крайней мере, предупреждение компилятора?

EDIT:

Я отправил отчет Apple об ошибке, и они признали его как уже существующий дубликат другого отчета. Таким образом, это будет обрабатываться/исправляться Apple каким-то образом.

Ответы

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