2016-08-13 2 views
2

Нили-коалесцирующий оператор (а ?? б) разворачивает в optianl а, если он содержит значение, или возвращает значение по умолчанию значение b, если a равно nil. Выражение a всегда имеет необязательный тип.Это не вызывает какие-либо ошибки, когда применить оператор Nil-коалесцирующем на ни необязательной переменной

Оператор Nil-Коалесцентный является сокращением для кода ниже

а! = Ноль? а! : Б

Я тогда попробовал следующий тест Фрагмент кода

//First 
let a: Int = 3, b: Int = 4 
a ?? b // No error 

&

//Second 
let a: Int = 3, b: Int = 4 
a != nil ? a! : b //Triggers an error: value of type 'int' can never be nil, comparison isn't allowed 

Вопрос:

Почему компилятор не дал ошибка для первого фрагмента кода при крике ошибка для второго? Разве они не такие же?

Большое спасибо

enter image description here

enter image description here

ответ

1

Ниль-коалесцирующий оператор

public func ??<T>(optional: T?, @autoclosure defaultValue:() throws -> T) rethrows -> T 

принимает дополнительный в первый операнд. Таким образом, a ?? b и a != nil ? a! : b эквивалентны при условии, что a является факультативным.

Это не так в вашем примере

let a: Int = 3, b: Int = 4 
a ?? b 

Первый операнд a не является обязательным. Однако компилятор может «обернуть» необязательное значение T в опционный T? для того, чтобы соответствовал функции или оператору. Например, в

func foo(x: Int?) { } 
foo(3) 

аргумент 3 заворачивают в Int?.

В вашем случае выражение эквивалентно

Optional<Int>.Some(a) ?? b 

что эквивалентно

Optional<Int>.Some(a) != nil ? Optional<Int>.Some(a)! : b 

Однако компилятор не настолько умен, чтобы признать, что Optional<Int>.Some(a) не может быть nil.

 Смежные вопросы

  • Нет связанных вопросов^_^