📅  最后修改于: 2021-01-11 08:05:39             🧑  作者: Mango
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存储为缺少值。可选的是具有两种情况的通用枚举:
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
可选绑定用于查找可选值是否包含值,如果包含,则将该值用作临时常量或变量。您可以使用任何可选的绑定控制结构,包括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