Swift 中问号“?”的含义是什么?
在本教程中,您将学习 Swift 语言中的问号是什么,如何使用它以及它的用途。
问号表示什么?
此问号表示变量可能包含 nil 值或与变量声明类型相同的值。
在学习问号之前,让我们先了解一下 Swift 中的可选类型。
可选类型
在 Swift 语言中创建变量时,它可以包含初始值,也可能在初始点不包含任何值。在这种情况下,您使用可选类型来表示具有两种可能情况的变量:值或根本没有值。
注意 - 在 Objective-C 中,没有可选类型的概念。
让我们用一个例子来理解它 -
var possibleNumber = "450" var convertedNumber = Int(possibleNumber)
在上面的示例中,有一个输入字符串,我们将其转换为 Int。但是,此字符串可能有效整数,也可能无效。在这种情况下,一旦我们使用 Int() 函数将此字符串转换为整数,它将返回一个可选的整数值。这意味着输出可以是 nil 或有效的整数值。
如何定义可选变量?
var possibleMessage: String?
理解这行代码的含义非常重要。这里有一个名为 possibleMessage 的字符串类型变量。在字符串单词后面的问号表示该变量可能包含有效的字符串值,也可能没有任何值。
为什么要使用问号?
var errorMessage: String = "Server not found"
在上面的代码行中,我们定义了一个带有值的字符串类型变量。现在,您想将此变量设置为 nil,因为您出于任何原因都不需要此值。让我们分配一个 nil 值 -
errorMessage = nil
使用上面的代码行构建代码,您会看到出现如下编译错误 -
error: 'nil' cannot be assigned to type 'String'
错误清楚地显示您无法将 nil 值分配给字符串类型变量。
注意 - 您不能将 nil 分配给非可选变量或常量。
那么如何将 nil 值分配给此变量?是的,您可以通过将此变量设为可选类型来分配 nil 值,如下所示 -
var errorMessage: String? = "Server not found"
现在您可以分配 nil 值,因为您已提前告诉编译器此变量可能包含 nil 值。
errorMessage = nil print(errorMessage)
输出
nil
解包值
值可以通过多种方式获取,但每种方法都用于不同的情况。
使用强制解包(不推荐)
在此方法中,您可以通过在变量名后添加感叹号(!)来访问值。如下所示 -
示例
var errorMessage: String? = "Invalid URL found" print(errorMessage!)
输出
Invalid URL found
如果您知道可选变量包含值,则可以使用它(!),否则,如果变量不包含值,则应用程序将崩溃。简单来说,感叹号表示“我知道此可选变量肯定有值;请使用它”。
有一种方法可以先检查然后使用感叹号与可选变量,如下所示 -
示例
var errorMessage: String? = "Invalid URL found" if errorMessage != nil { print("error message is not nil: \(errorMessage!)") }
输出
error message is not nil: Invalid URL found
解释
首先,我们声明一个字符串类型的可选变量。接下来,我们检查变量是否不等于 nil。如果不等于 nil,则打印变量的值。通过这种方式,您的应用程序不会崩溃,因为您已经检查过了。
可选绑定(推荐)
要读取可选变量的值,这是推荐的方法。在此方法中,您检查变量是否有值。如果找到值,则将该值保存在局部常量或变量中。让我们看一个例子 -
示例
var errorMessage: String? = "Invalid URL found" if let message = errorMessage { print("Error message: \(message)") }
输出
Error message: Invalid URL found
在这里,您将值存储在临时常量“message”中,然后使用它。如果 errorMessage 没有值或为 nil,则 if 条件将不成立。因此,您可以看到这是一种非常安全的方法,可以从可选变量中解包值。
结论
Swift 的 nil 与 Objective-C 的 nil 不同。在 Objective-C 中,nil 是一个指向内存中不存在的对象的指针。在 Swift 中,nil 不是指针,它指向内存中不存在的特定类型的值。