为什么打开一个不能为零的变量?
新斯威夫特,看到代码斯威夫特编程如下的斯坦福开放课程:为什么打开一个不能为零的变量?
if pending != nil {
acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
pending = nil
}
当我了解展开,pending
,在这种情况下,保证不被零里面if
块,那么为什么要我使用!
在使用它时打开挂起?
因为if
检查对块内的代码没有影响。在这个例子中,你应该使用一个let
,像这样:
if let nonNilPending = pending {
acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator)
pending = nil
}
这样,你避免了力解开。
虽然我仍然对Swift感到困惑,但我仍然可以推断出很多东西,为什么它的编译器无法弄清楚在这样的可选变量中是不可能的情况?我假设Swift中'可选'的概念在C++中是'null'的...因此,如果可以阻止内部块使用nil或void或null变量执行。 –
即使您知道pending
不是nil
,它的类型仍然是可选的。编译器在各种上下文中(即if
的内部和外部)并没有以不同的方式对待它,因此您必须在两个地方都使用!
运算符。
Swift确实为您提供了一个机制来检查nil
并拆开一个if let
construct,这是一个方便的替代强制解包。
因为即使你在那个块中,编译器也不知道该变量是“解包”的。最重要的是,使用force unwrap是个不错的主意。如果if条件解开变量,然后使用你设置的常量,你会更好。例如:
if let unwrappedPending = pending {
accumulator = unwrappedPending.binaryFunction(...)
pending = nil
}
通过设置可选pending
的常数,你有条件地展开它。然后,你可以使用恒定的知道该常数不是零的安全性,你不必使用!
相关:[Swift可选参数未解包](http://stackoverflow.com/questions/40290202/swift-optional-parameter-not-unwrapped) – Hamish