可以访问带有问号但没有感叹号的可选变量吗?

Kyo*_*ang 1 swift

我知道带有问号的可选常量或变量需要感叹号才能访问其值.然后,我尝试使用以下代码检查它.

var aaa:String? = "3"
println("aaa = \(aaa!)")
Run Code Online (Sandbox Code Playgroud)

是.没关系.它在控制台输出上打印"3".我接受了下一次考试

var aaa:String? = "3"
println("aaa = \(aaa)")
Run Code Online (Sandbox Code Playgroud)

它还打印"3"没有任何错误消息.它运作良好.

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

dre*_*wag 5

您正确理解了Optionals和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)
}
Run Code Online (Sandbox Code Playgroud)

此外,还有一些关于实例打印的额外信息.打印使用Printable定义description属性的协议.任何实现此协议的内容都可以自定义打印方式.Optional有自己的协议实现,它决定打印"零"或description实际值.