📜  Swift中的可选

📅  最后修改于: 2021-01-11 08:05:39             🧑  作者: Mango

在Swift中是可选的

Swift可选是Swift编码的基本部分。 Optional用于将良好代码与错误代码分开,并防止崩溃。每种编程语言都有一些预防措施来避免崩溃。在这种情况下,Swift更实用,并且可以选择使用它使代码免于崩溃

宣言

enum Optional 

可选类型何时使用,使用可选值,即使你从来没有键入的文本可选。 Swift的类型系统通常显示包装的类型名称以及问号(?),而不显示完整的类型名称。

例如,如果变量的类型为Int? ,这是相同的,只是另一种书写方式。此简短形式仅用于使代码容易和简单。

请参见以下示例。

此处,以下代码示例中的shortForm和longForm的类型相同:

let shortForm: Int? = Int("143")
Or
let longForm: Optional = Int("143") 
//Both are same 

可选,不保留任何保留某些值。可选允许将nil存储为缺少值。可选的是具有两种情况的通用枚举:

  • Optional.none :等效于nil字面量。
  • Optional.some(Wrapped) :它存储包装的值。

let number: Int? = Optional.some(143)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"

输出:

true

上面程序中的问号(?)表示它是一个可选变量。如果在变量声明的末尾看到问号,则它肯定是可选的,并且可能包含也可能不包含值。因此,在程序的某个部分,您不知道变量是否有值,然后将其标记为可选。

现在,看下面的例子:

在这里,我们尝试打印变量'numberOfStudents'的值。

var numberOfStudents : Int?
print(numberOfStudents!)

在此,变量末尾的感叹号(!)用于解包该值。但是,如果尝试执行代码,则代码将崩溃。这是因为,您只需要强制解开一个没有值的可选变量即可。如果变量中没有值,则程序将崩溃。

为变量设置一个值

如果在强制解开该值之前为变量设置了一个值,则代码不会崩溃,但这不是一种好的编码习惯,而是滥用了可选变量。

var numberOfStudents : Int?
numberOfStudents = 30
print(numberOfStudents!)

输出:

30

您可以先进行nil检查,然后再强制打开可选包装。

例如:

var numberOfStudents : Int?
if numberOfStudents != nil {
print(numberOfStudents!)
}

现在,您的程序将不会崩溃,因为仅在执行nil检查后才强制展开可选变量。

var numberOfStudents : Int?
if let studentCount = numberOfStudents {
print(studentCount) // It is same as print(numberOfStudents!)
}

上面的方法将检查可选变量'numberOfStudents'是否包含某个值。如果存在,则将其复制到一个名为StudentCount的常量,然后仅执行代码块。

强制展开

当您将变量定义为可选变量然后要从该变量中获取值时,必须将其解包。强制展开是在变量末尾添加感叹号的过程。

让我们看一个例子以使之清楚。

示例:(在应用展开之前)

var userString:String?
userString = "Hello World"
if userString != nil {
   print(userString)
} else {
   print("userString has nil value")
}

输出:执行上述代码时,将给出以下输出:

Optional("Hello World")

示例:(应用展开后)

现在,我们应用展开以获取变量的正确值。

 var userString:String?
userString = "Hello World"
if userString != nil {
   print(userString!)
} else {
   print("userString has nil value")
}

输出:

Hello World

自动展开

自动展开提供了一种使用感叹号而不是问号声明可选变量的方法。通过这种方式,变量将自动展开,并且您不需要在变量末尾使用任何其他的感叹号来获取分配的值。

让我们来看一个例子。

例:

var userString:String!
userString = "Hello World"
if userString != nil {
   print(userString)
} else {
   print("userString has nil value")
}

输出:

Hello World

Swift可选绑定

可选绑定用于查找可选值是否包含值,如果包含,则将该值用作临时常量或变量。您可以使用任何可选的绑定控制结构,包括if let,guard let等。

让我们以一个示例来看一下if语句的可选绑定:

例:

var userString:String?
userString = "Hello world"
if let myString = userString {
   print("The value of my string is - \(myString)")
} else {
   print("My string does not have a value")
}

输出:

The value of my string is - Hello world