Swift Optional ( 可选类型 ) 总结

2016-08-18  本文已影响690人  木叔勒

一、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

上一篇下一篇

猜你喜欢

热点阅读