首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要解包一个不能为空的变量呢?

为什么要解包一个不能为空的变量呢?
EN

Stack Overflow用户
提问于 2016-11-07 23:14:57
回答 3查看 141关注 0票数 3

Swift新手入门,Swift编程的Standford公开课代码如下:

代码语言:javascript
复制
if pending != nil {
    acccumulator = pending!.binaryFunction(pending!.firstOperand,acccumulator)
    pending = nil
}

由于我了解了展开,在这种情况下,pendingif块中被确保不为空,那么为什么我在使用它时要使用!来展开挂起的?

EN

回答 3

Stack Overflow用户

发布于 2016-11-07 23:20:18

因为if检查对块内的代码没有影响。在本例中,您应该使用let,如下所示:

代码语言:javascript
复制
if let nonNilPending = pending {
    acccumulator = nonNilPending.binaryFunction(nonNilPending.firstOperand,acccumulator)
    pending = nil
}

这样就避免了强制展开。

票数 4
EN

Stack Overflow用户

发布于 2016-11-07 23:20:47

即使您知道pending不是nil,它的类型仍然是可选的。编译器在不同的上下文中(即在if内部和外部)没有区别地对待它,所以你必须在这两个地方使用!运算符。

Swift确实提供了一种机制,可以使用if let construct在一次go中检查nil和解包,这为强制解包提供了一个方便的替代方案。

票数 4
EN

Stack Overflow用户

发布于 2016-11-07 23:22:58

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

代码语言:javascript
复制
if let unwrappedPending = pending {
    accumulator = unwrappedPending.binaryFunction(...)
    pending = nil
}

通过将可选的pending设置为常量,可以有条件地对其进行解包。然后,您可以安全地使用常量,因为您知道常量不是空的,并且不必使用!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40468533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档