swift - 可以访问带问号而不带感叹号的可选变量吗?

标签 swift

我知道带问号的可选常量或变量需要感叹号才能访问其值。然后,我尝试使用以下代码对其进行测试。

var aaa:String? = "3"
println("aaa = \(aaa!)")

是的。没关系。它在控制台输出上打印了“3”。下一次考试我就这样尝试了

var aaa:String? = "3"
println("aaa = \(aaa)")

它还打印了“3”,没有任何错误信息。效果很好。

我了解到 Forced Unwrapping 需要感叹号才能访问 Optional 的值。但是,我可以在没有标记的情况下访问它。这样对吗?我想知道出了什么问题。我是否误解了 Optional?

最佳答案

您正确理解了 Optional 和 Forced Unwrapping。您可以打印可选变量的原因是 Optional 类型也可以打印。如果您打印 Optional 而不是实际值,它会打印值(如果有)或“nil”(如果没有)。

此外,以防万一您没有意识到这一点。强制解包会导致整个程序崩溃,如果可选值当时为 nil。为了更安全,你应该使用 Optional Binding :

var aaa: String? = "3"
if let actualString = aaa {
    // actualString becomes a non-optional version of aaa
    // if aaa were nil, this block would not be run at all
    println(actualString)
}

此外,还有一些关于实例打印的额外信息。打印使用定义了 description 属性的 Printable 协议(protocol)。任何实现此协议(protocol)的东西都可以自定义它们的打印方式。 Optional 有自己的协议(protocol)实现,它决定打印“nil”或实际值的 description

关于swift - 可以访问带问号而不带感叹号的可选变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369955/

相关文章:

ios - 快速更改页面指示器图像 [SMPageControl]/EAIntroView

ios - libc++abi.dylib : terminating with uncaught exception of type NSException (lldb) : Drop Down Menu

arrays - Swift 3 获取照片图像的 PHImageFileURLKey

ios - 将枚举值设置为核心数据对象

ios - 遍历 UIImage 的所有像素

ios - 如何知道 UIScrollView 是否触及顶部 ScrollView 与另一个 View 的 CGPoint 相交

ios - 在之后/之前显示当前页码

ios - 如何单击其中一个按钮在 Swift 的 TableViewCell 中显示图像?

swift - 部分 UIView 的屏幕截图被屏蔽为 UIBezierPath/CGPath

Swift - 选择随机函数