为什么打开一个不能为零的变量?

时间:2016-11-07 15:14:57

标签: swift unwrap

Swift的新手,看到来自斯坦福开放Swift编程课程的代码如下:

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

当我学习解缠时,pending,在这种情况下,确保在if块内不是nil,那么为什么我在使用它时使用!来解包挂起?

3 个答案:

答案 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,你不必使用!