Optional
Optioanl 是通过 enum 实现的⼀个⾮常好的代表,这⾥我们可以通过阅读 Optional 的源码来看⼀下:
可以看到这⾥ Optional 的本质是⼀个 enum 。当前枚举接收⼀个泛型参数,⽽当前 some 的关联值是当前的 Wrapped ,也就是说下⾯两种写法是完全等价的:
var age: Int?
var age1: Optional<Int>
同样的,既然是枚举,那么我们是不是可以通过模式匹配来匹配对应的值
var age: Int? = 10
switch age{
case nil:
print("age 是个空值")
case .some(10):
print("age的值是\(age)")
}
涉及到
Optional
我们就不得不⾯对⼀个问题:解包。因为当前的可选项其实是对我们的值做了包装, 当前不为 nil
的时候我们就需要从其中拿到我们要的值。 ⽐较粗暴的⽅式是:强制解包 !这样做的好处是省事,坏处是当前⼀旦 age 是nil ,那么应⽤程序就会崩溃,
这⾥⽐较好的做法就是使⽤
if let
或者
guard let
.这⾥我们是通过可选项绑定的⽅式来判断当前
的可选项是否有值,
我们看⼀下写法:
var age: Int? = nil
if let unWrappedValue = age{
print("value: \(unWrappedValue)")
}else{
print("age 为nil")
}
guard let unWrappedValue = age{
print("age为空")
}
print(unWrappedValue)
可以看到
gurad
后⾯的判断条件为 false 的时候会执⾏当前⼤括号⾥⾯的内容,反之执⾏后⾯的代码。 gurad 在我们当前这句代码⾥⾯扮演的⻆⾊就是如果当前为空,我们就退出我们当前的递归调⽤。 其次,⼤家来看⼀个点:我们在使⽤ if let
创建的内容当中
unWrappedValue
仅仅只能在当前
if 分⽀的⼤括号内访问到,⽽我们当前的 guard
定义的
unWrappedValue
在当前⼤括号外部也是能访 问到的。