本文概述
- 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")
}
【Swift Optional介绍和详细用法示例】输出
The value of my string is - Hello world
推荐阅读
- 全链路压力测试平台
- 领域驱动设计 - 战术设计 - 3/3聚合与模型的构建方法
- Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统
- MSTP+VRRP+静态路由+子网划分+DHCP实验案例
- ICDE 2022稀疏模型训练框架HybridBackend,单位成本下训练吞吐提升至5倍
- Redis cluster命令部署集群及数据导入
- Linux系列(if语句的使用(if thenelif thenelse fi))
- Linux系列(圆括号()(())$()的区别)
- Linux系列(让一个脚本同时只能运行一个(flock锁处理))