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 不是指针,它指向内存中不存在的特定类型的值。

更新于: 2022年11月22日

2K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告