2015-10-19 3 views
14

Какое объяснение для этого поведения?Операторы Swift и nil

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

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

EDIT:

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

+0

Это интересно, потому что 'Optional' должно быть объявлено с 'let' - похоже, что я ошибся –

+1

Это похоже на ошибку, это работает, даже если вы сравниваете с nil напрямую, как' if nil <-100' –

+1

Трудно поверить в ошибку на таком базовом уровне языка. – Darko

ответ

15

Две вещи случаются здесь (независимо от того, нравится нам это или нет): Во-первых, есть оператор

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).

+3

отличное объяснение. это так грубо. : D –

+0

Я просто пришел к тем же результатам. Существует * некоторая * документация для протокола «Comparable», которая определяет значение по умолчанию '<', однако объяснение полностью игнорирует опции. – Sulthan

+0

Это особенно уродливое, как кажется, похожее на тип. например на игровой площадке 'x Abizern