2016-11-07 16 views
3

Новый Свифт и увидел код из Standford открытого курса программирования Swift, как показано ниже:Зачем разворачивать переменную, которая не может быть равна нулю?

if pending != nil { 
    acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator) 
    pending = nil 
} 

Как я узнаю о разворачивании, pending, в этом случае обеспечиваются не равным нулем внутри if блока, то зачем Я использую ! для разворачивания при его использовании?

+2

Связанный: [необязательный необязательный параметр Swift не распакован] (http://stackoverflow.com/questions/40290202/swift-optional-parameter-not-unwrapped) – Hamish

ответ

4

Поскольку проверка if не влияет на код внутри блока. В этом примере, вы должны вместо этого использовать let, например, так:

if let nonNilPending = pending { 
    acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator) 
    pending = nil 
} 

Таким образом, вы избежите силы-разворачивает.

+0

Я обожаю это, хотя я все еще смущен для Swift, может вывести много вещей и почему его компилятор не может определить невозможность nil для необязательной переменной в таких ситуация? Я предполагаю, что понятие «необязательный» в Swift является «нулевым» в C++ ... Таким образом, если бы он предотвращал выполнение внутреннего блока с помощью переменной nil или void или null. –

4

Даже если вы знаете, что pending не является nil, его тип остается необязательным. Компилятор не рассматривает его по-разному в разных контекстах (то есть внутри и снаружи if), поэтому вам нужно использовать оператор ! в обоих местах.

Компания Swift предлагает вам механизм для проверки на наличие nil и разворот в один проход с помощью if let construct, который представляет собой удобную альтернативу принудительной разворачиванию.

2

Потому что, даже если вы находитесь в этом блоке if, компилятор не знает, что переменная «разворачивается». Кроме того, использование разворота силы - плохая идея. Вам лучше было бы разворачивать переменную в условном выражении, а затем использовать константу, которую вы ее установили. Например:

if let unwrappedPending = pending { 
    accumulator = unwrappedPending.binaryFunction(...) 
    pending = nil 
} 

, установив дополнительный pending к постоянной, вы условно разворачивая его. Затем вы можете использовать константу с безопасностью, зная, что константа не равна нулю, и вам не нужно использовать !