Swift 可选类型的使用
可选类型是Swift编码中的基本部分。可选类型的作用是将良好的代码与不良的代码分开,并避免崩溃。每种编程语言都有一些预防措施来避免崩溃。在这方面,Swift更加实用,可选类型可以使你的代码无崩溃。 ** .
声明
enum Optional
可选类型 是在使用可选值时使用的,即使您从未输入过Optional这个单词。Swift的类型系统通常会显示包装类型的名称,然后跟一个问号(?),而不是显示完整的类型名称。
例如 ,如果一个变量的类型是 Int? ,它与写作Optional是相同的,只是另一种简洁的写法,以使代码易于阅读和简化。
请看以下示例。
在下面的代码示例中,shortForm和longForm的类型是相同的:
let shortForm: Int? = Int("143")
Or
let longForm: Optional = Int("143")
//Both are same
Optional(可选类型)可以代表 没有任何值 或 有值 的情况。可选类型允许将 nil 作为没有值的表示。可选类型是一个泛型枚举,有两个case:
- 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