Optional

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 在当前⼤括号外部也是能访 问到的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值