2016-11-07 32 views
3

新斯威夫特,看到代码斯威夫特编程如下的斯坦福开放课程:为什么打开一个不能为零的变量?

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感到困惑,但我仍然可以推断出很多东西,为什么它的编译器无法弄清楚在这样的可选变量中是不可能的情况?我假设Swift中'可选'的概念在C++中是'null'的...因此,如果可以阻止内部块使用nil或void或null变量执行。 –

4

即使您知道pending不是nil,它的类型仍然是可选的。编译器在各种上下文中(即if的内部和外部)并没有以不同的方式对待它,因此您必须在两个地方都使用!运算符。

Swift确实为您提供了一个机制来检查nil并拆开一个if let construct,这是一个方便的替代强制解包。

2

因为即使你在那个块中,编译器也不知道该变量是“解包”的。最重要的是,使用force unwrap是个不错的主意。如果if条件解开变量,然后使用你设置的常量,你会更好。例如:

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

通过设置可选pending的常数,你有条件地展开它。然后,你可以使用恒定的知道该常数不是零的安全性,你不必使用!

相关问题