使用或不使用“!”之间有什么区别在斯威夫特?

时间:2014-06-15 14:11:32

标签: swift optional-variables

!标记用于Swift中的可选值以提取其包装值,但可以在不!的情况下提取值:

var optionalString: String? = "optionalString"
println(optionalString)

使用!的另一个例子:

var optionalString: String? = "optionalString"
println(optionalString!)

上面的代码都得到了正确的值,所以我想知道使用和不使用!之间的区别是什么,它是否只是为了在运行时检测错误,如果可选值为nil或其他?提前谢谢。

3 个答案:

答案 0 :(得分:4)

正如其他人已经说过的那样,一个非常好的起点是官方文件。文档非常清楚地涵盖了这个主题。

来自官方文件:

  

尝试使用!访问不存在的可选值会触发a   运行时错误。始终确保可选项包含非零值   使用前的价值!强行解开它的价值。

println()可能不是测试!运算符如何工作的最佳方法。没有它,println()将打印值或nil,它将打印值或崩溃。

主要区别在于我们尝试将可选项分配给另一个值或在函数的参数中使用它。

假设optionalValue是一个可选的整数。

let actualValue = optionalValue

使用此分配,actualValue现在只是另一个可选整数。我们还没有打开这个价值。我们有一个可选的而不是整数。

同时,

let actualValue = optionalValue!

现在我们正在强行解开。实际值将是整数而不是可选整数。但是,此代码将导致运行时异常为optionalValue为nil。

答案 1 :(得分:2)

你的问题在书中得到了解答" The Swift Programming Language:iBooks

下载并搜索"!"。

你可以轻松找到答案,而不必在这里问。如需将来参考,请务必先阅读本手册。

来自" Swift编程语言":

  

您可以使用" if"声明以确定可选项是否包含值。如果一个可选项确实有一个值,它的计算结果为" true&#34 ;;如果它根本没有价值,则评估为" false"。

     

一旦您确定可选的 包含值,您就可以通过在可选的名称末尾添加感叹号(!)来访问其基础值。感叹号有效地说,"我知道这个选项肯定有价值;请使用它。"这被称为强制展开的可选值。

答案 2 :(得分:1)

我之前从未听说过Swift,但阅读documentation似乎很清楚

  

"使用!运算符以打开值为nil的可选项导致运行时错误。"

如果您的应用程序nil在任何正常情况下都是有效且预期的值,并且/或者您想要在代码中捕获并处理它,那么我建议您不要使用它。如果您从未期望它是nil,那么请将其用作调试辅助工具。 运行时错误向我建议您的程序将以操作系统报告的消息终止。