本文概述
Swift可选是Swift编码的基本部分。 Optional用于将良好代码与错误代码分开并防止崩溃。每种编程语言都有一些预防措施来避免崩溃。在这种情况下, Swift更为实用, 并且可以选择使代码免于崩溃。
Optional
enum Optional<Wrapped>
每当你使用可选值时, 都会使用可选类型, 即使你从未键入”可选”一词也是如此。 Swift的类型系统通常显示包装的类型名称以及问号(?), 而不显示完整的类型名称。
例如, 如果变量的类型为Int ?, 则它是相同的, 只是编写Optional的另一种方式。此简短形式仅用于使代码容易和简单。
请参见以下示例。
此处, 以下代码示例中的shortForm和longForm的类型相同:
let shortForm: Int? = Int("143")
Or
let longForm: Optional<Int> = 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
你可以在强制打开可选包装之前进行零检查。
例如:
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