Swift的新手,看到来自斯坦福开放Swift编程课程的代码如下:
if pending != nil {
acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
pending = nil
}
当我学习解缠时,pending
,在这种情况下,确保在if
块内不是nil,那么为什么我在使用它时使用!
来解包挂起?
答案 0 :(得分:4)
因为if
检查与块内的代码无关。在此示例中,您应该使用let
,如下所示:
if let nonNilPending = pending {
acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator)
pending = nil
}
这样你就可以避免强行拆开。
答案 1 :(得分:4)
即使您知道pending
不是nil
,其类型仍然是可选的。编译器在各种上下文中(即if
内外)不会对它进行不同的处理,因此您必须在两个地方都使用!
运算符。
Swift确实为您提供了一种机制来检查nil
并使用if let
construct一次性解包,这是强制解包的一种方便的替代方法。
答案 2 :(得分:2)
因为即使你在那个if块中,编译器也不知道该变量是“unwrapped”。最重要的是,使用force unwrap是一个坏主意。最好在if条件中展开变量,然后使用你设置的常量。例如:
if let unwrappedPending = pending {
accumulator = unwrappedPending.binaryFunction(...)
pending = nil
}
通过将可选pending
设置为常量,您可以有条件地展开它。然后你可以使用常量,知道常量不是nil,你不必使用!