3

刚接触 Swift 并看到了 Standford open course of Swift 编程的代码如下:

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

当我了解展开时pending,在这种情况下,确保不会在if块内为 nil,那么我为什么要!在使用它时使用展开挂起呢?

4

3 回答 3

4

因为if检查与块内的代码无关。在此示例中,您应该使用 a let,如下所示:

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

这样你就可以避免强制展开。

于 2016-11-07T15:20:17.720 回答
4

即使您知道pending不是nil,它的类型仍然是可选的。编译器不会在各种上下文(即 inside 和 outside if)中区别对待它,因此您必须在两个地方都使用!operator。

Swift 确实为您提供了一种通过构造nil一次性检查和解包的机制,它为强制解包提供了一种方便的替代方案。if let

于 2016-11-07T15:20:46.643 回答
2

因为即使你在那个 if 块中,编译器也不知道变量是“解包的”。最重要的是,使用强制展开是一个坏主意。您最好在 if 条件中解开变量,然后使用您设置的常量。例如:

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

通过将可选项设置pending为常量,您可以有条件地展开它。然后你可以安全地使用常量,知道常量不是 nil 并且你不必使用!

于 2016-11-07T15:22:58.080 回答