Swift中的可选类型
原创文章。谈一谈对Swift中可选类型的理解与实际应用,如有错误,望读者指正,谢谢!
什么是可选类型?
可选类型是一种用来强检验一个常量或变量是否具有值的语法。可选类型的存在让Swift成为一种强类型语法
怎么使用可选类型?
0.可选类型的含义
可选类型可用于一个对象的初始值的情况。
由于在Swift中定义一个对象时,必须明确指明其初始值,不能为空值。如果不想在定义时赋予初始值,唯一的办法就是将其定义为可选类型
需要注意的是:
可选类型中的nil与OC中的nil代表的含义是不同的。
OC中的nil表示空指针,代表变量不指向任何内存地址。OC中对空指针发送消息不会发生任何事情
Swift中nil也是一种类型,表示变量或常量的值缺失。在Swift中使用一个值缺失的对象,将会导致程序崩溃
1.定义可选类型
- 常规写法
var name : Optional<String>
- 快捷写法(常用)
var name : String?
</br>
2.从可选类型中取值
- 强制解析:
在可选类型后加上一个"!"即可取得可选类型中的值
print(name!)
强制解析是危险操作,如果对象的实际值为nil,解包会导致crash。所以如果不能确定对象必然有值,不建议直接使用强制解析,而是先进行一次校验:
if name != nil {
print(name!)
}
- 可选绑定(常用)
写法1:
if let tempName = name {
print(tempName)
}
这个语句会先判断name是否有值,如果没有值,则判断条件为false,不会执行{}中的语句。 如果name有值,则系统会对其进行解包,将解包后的结果赋值给tempName
写法2:
if let name = name {
print(name)
}
利用了变量作用域的原理,用临时变量覆盖了原本的变量。本质上与写法1一样
- 通过guard的方式进行可选绑定(常用)
由于在Swift中除了if可以进行条件判断外,还可使用guard进行判断。因此同样可以使用guard语句进行可选绑定:
guard let name = name else {
return
}
guard校验与if类似,如果name有值,则进行赋值,跳过else中的代码。如果name为nil,则只需else中的语句,不再继续往下执行
- 空合运算符(摘自 <<The Swift Programming Language>>中文翻译)
空合运算符即??
,使用示例如下:
realName = name ?? ""
表示如果name有值时则将name解析并赋值给realName,否则则将运算符后的默认值(即空字符串)赋值给realName
</br>
</br>
"!"和"?"运算符的含义
在Swift中经常可以看到这两个运算符,那么他们到底有哪些含义呢?
一.?
1.用在三目运算符中,表示条件选择,例如:
let isAdult: Bool = (age > 18) ? true : false
当?之前的条件为真时,执行问号后的语句,否则执行冒号后的语句
2.用在定义一个变量时,用来表示该变量为可选类型,例如:
var name: String?
之后给这个变量赋值时,可以赋一个确定有值的String,也可以赋值为nil
3.用在语句中,根据变量的值是否为nil决定是否继续执行代码,例如:
var person: Person?
person?.name.firstName = "Wang"
如果person的实际值为nil,则整句代码都不会执行。如果person不为nil,则会执行代码,对firstName赋值
4.在赋值时,使用"??"来进行条件判断,赋默认值,例如:
var age: Int = person.age ?? "10"
如果person的age值不为nil,则会给变量age赋值。如果为nil,则将默认值10赋值给age
5.跟在as后,表示可选的类型转换,例如:
let str: String? = "abc"
let nsStr = str as? NSString
这句代码将会把str转化为一个NSString?的对象。nsStr的类型是NSString?,即可选类型。
as?常用在向下转型,也就是将子类的对象转化为父类对象。
6.用在执行协议中的可选方法时。因为遵循协议的代理不一定实现了可选方法,所以在调用可选方法时,需要在方法名后加上一个?。如果实现了方法,则会调用,否则不执行
"?"的用法基本就这些了,如果有遗漏的,欢迎补充。