Swift Optional ( 可选类型 ) 总结
一、Optional 定义归纳
(1).Swift中声明一个变量或常量时需要返回nil。
(2).Swift中基础类型如整型、布尔等可空时为nil。
(3).Swift中nil也代表一个值:空值。
(4).OC中的nil和Swift有一些需求,OC只有对象才能为nil。
(5).当我们需要定义一个可空的变量或常量时,Optional就发挥作用了,在 Swift中定于常量或变量时如果类型不是Optional是不能为nil的。
二、Optional 声明
**定义可选类型只需要在类型后面加上 ( ? ) **
有以下几种声明方法:
//1.使用Optional声明(可选类型是一个枚举)
var name:Optional<String>
//1.赋值
name = Optional("Danny")
//2.常用声明
var age:Int?
//2.赋值
age = 17
//3.常量声明
let notes:NSString?
//3.赋值(常量只能赋一次值)
notes = "this is test"
三、Optional 拆包
(1).为什么我们要对Optional拆包
申明为Optional后,不拆包的格式是被Optional包住的:Optional("Danny");实际上我们需要使用的是Danny这个值,所以需要拆包得到
(2).拆包分为:显式拆包和隐式拆包
1.显式拆包
在我们事先声明好的Optional类型名后面加( !)
//声明
var name:String? = "Danny"
//显式拆包
print(name!)
2.隐式拆包
当我们确定该变量一定会有值的时候在类型后面加( ! )
//确定name一定会有值
var name:String!= "Danny"
四、Optional Binding
(1).判断一个可选类型是否为nil,通常写法是下面这种
var name:String? = "Danny"
if name != nil {
print("not nil")
}else{
print("nil")
}
(2).判断一个可选类型是否为nil并且我们需要使用该可选类型怎么办呢?
var name:String? = "Danny"
if name != nil {
print(name!) //使用 !拆包
}else{
print("nil")
}
(3).接上(2)如果我们需要使用多次使用到name?难道要多次使用!拆包吗?答案是肯定这种方法不可取的,下面这种方法表示只进行一次拆包。
var name:String? = "Danny"
if let letName = name {
print(letName)
}else{
print("nil")
}
说明:通过在条件判断语句中把Optional值直接给一个临时常量,Swift会自动检测Optional是否包含值,如果包含值,会隐式的拆包并给那个临时常量,在接下来的上下文中就能直接使用这个临时常量了
四、Optional Chaining
可选链主要的应用场景是比较复杂的对方,如果一个对象中的属性包含了一个对象,子对象中的属性又包含了一个对象,这样就形成了可选链,可空返回nil。
class Person {
var myPet:Dog?
}
class Dog{
var myToy:Toy?
}
class Toy {
var name = "name"
init(name:String){
self.name = name;
}
}
let denny = Person();
denny.myPet = Dog();
denny.myPet?.myToy = Toy(name: "Ball")
if let toy = denny.myPet?.myToy{
toy.name
}
注意:整条链上只要有一个Optional返回nil,则整条链都为nil