刚接触 Swift 并看到了 Standford open course of Swift 编程的代码如下:
if pending != nil {
acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
pending = nil
}
当我了解展开时pending
,在这种情况下,确保不会在if
块内为 nil,那么我为什么要!
在使用它时使用展开挂起呢?
因为if
检查与块内的代码无关。在此示例中,您应该使用 a let
,如下所示:
if let nonNilPending = pending {
acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator)
pending = nil
}
这样你就可以避免强制展开。
即使您知道pending
不是nil
,它的类型仍然是可选的。编译器不会在各种上下文(即 inside 和 outside if
)中区别对待它,因此您必须在两个地方都使用!
operator。
Swift 确实为您提供了一种通过构造nil
一次性检查和解包的机制,它为强制解包提供了一种方便的替代方案。if let
因为即使你在那个 if 块中,编译器也不知道变量是“解包的”。最重要的是,使用强制展开是一个坏主意。您最好在 if 条件中解开变量,然后使用您设置的常量。例如:
if let unwrappedPending = pending {
accumulator = unwrappedPending.binaryFunction(...)
pending = nil
}
通过将可选项设置pending
为常量,您可以有条件地展开它。然后你可以安全地使用常量,知道常量不是 nil 并且你不必使用!