Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 访问带问号但不带感叹号的可选变量可以吗?_Swift - Fatal编程技术网

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
    ...
}