Swift 访问带问号但不带感叹号的可选变量可以吗?
我知道带问号的可选常量或变量需要一个感叹号才能访问其值。然后,我试着用下面的代码检查它Swift 访问带问号但不带感叹号的可选变量可以吗?,swift,Swift,我知道带问号的可选常量或变量需要一个感叹号才能访问其值。然后,我试着用下面的代码检查它 var aaa:String? = "3" println("aaa = \(aaa!)") 对。没关系。它在控制台输出上打印“3”。下一次考试我就这么试了 var aaa:String? = "3" println("aaa = \(aaa)") 它还打印了“3”,没有任何错误消息。它工作得很好 我了解了强制展开,需要en感叹号才能访问可选值。但是,我可以在没有标记的情况下访问它。是这样吗?我不知道怎么
var aaa:String? = "3"
println("aaa = \(aaa!)")
对。没关系。它在控制台输出上打印“3”。下一次考试我就这么试了
var aaa:String? = "3"
println("aaa = \(aaa)")
它还打印了“3”,没有任何错误消息。它工作得很好
我了解了
强制展开
,需要en感叹号才能访问可选值。但是,我可以在没有标记的情况下访问它。是这样吗?我不知道怎么了。我是可选的吗?函数的println
是一个特例。它会自动为您打开变量。如果变量为nil
,它将打印nil
。在其他上下文中,确实需要自己打开变量。函数的println
是一种特殊情况。它会自动为您打开变量。如果变量为nil
,它将打印nil
。在其他情况下,您确实需要自己展开变量。您正确理解了选项和强制展开。可以打印可选变量的原因是也可以打印类型optional
。如果打印的是可选
,而不是实际值,则如果有,则打印该值;如果没有,则打印“nil”
还有,以防万一你没有意识到。如果可选项当时为零,则强制展开将导致整个程序崩溃。为了更安全,您应该使用:
另外,还有一些关于实例打印的额外信息。打印使用协议
Printable
,该协议定义了description
属性。实现此协议的任何东西都可以自定义它们的打印方式可选
有自己的协议实现,它决定打印“nil”或实际值的说明。您正确理解可选和强制展开。可以打印可选变量的原因是也可以打印类型optional
。如果打印的是可选
,而不是实际值,则如果有,则打印该值;如果没有,则打印“nil”
还有,以防万一你没有意识到。如果可选项当时为零,则强制展开将导致整个程序崩溃。为了更安全,您应该使用:
另外,还有一些关于实例打印的额外信息。打印使用协议Printable
,该协议定义了description
属性。实现此协议的任何东西都可以自定义它们的打印方式可选
有自己的协议实现,这是它决定打印“nil”或实际值的说明
。Println()
将打印值(如果有),否则将打印nil。为了更好地理解,请尝试将aaa
的值赋给另一个字符串变量。它将抛出可选类型的值未展开的错误
因此,要回答您的问题,您需要使用代码>以获取值
编辑:
将foo
计算为True
的原因是它没有被展开。因为它没有展开,所以只需检查它是否有值(真或假并不重要)
当打开foo
时,它返回一个值False
,因此第二个if条件失败 Println()
将打印值(如果有),否则将打印nil。为了更好地理解,请尝试将aaa
的值赋给另一个字符串变量。它将抛出可选类型的值未展开的错误
因此,要回答您的问题,您需要使用代码>以获取值
编辑:
将foo
计算为True
的原因是它没有被展开。因为它没有展开,所以只需检查它是否有值(真或假并不重要)
当打开foo
时,它返回一个值False
,因此第二个if条件失败
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)
}
var aString:NSString? = "Hello"
var bString = aString // Compiler allows, as you are assigning to optional type again.
var cString:NSString = aString // Compiler throws error. You cannot assign optional type without unwrapping.
var foo:Bool?
foo = false
if foo { // This always evaluates to `True`
...
}
if foo! { // This condition will now fail
...
}