对于一些可选值,一般最好经过判断之后确定其不为nil的情况下,再去用!强制解包,这是可以通过if来进行判断。但是过多使用if判断会让代码看起来很凌乱。Swift中提供了if let和guard let解决这个问题。
if let
func demo() {
let name: String? = "老王"
let age: Int? = 10
//if let 连用,判断对象的值是否为nil,如果不为nil,直接执行if中的代码
if let nName = name,
let nAge = age {
//这里的name和age一定有值
print(nName + String(nAge))
//注意:这里的nName和nAge仅在作用域内有效
}else{
print("name或age有一个为空")
}
}
guard let:guard let和if let刚好相反,guard let守护一定有值。如果没有,直接返回
func demo() {
let name: String? = "老王"
let age: Int? = 10
guard let nName = name, let nAge = age else{
print("name或age有一个为空")
return
}
//代码到此,nName和nAge一定有值。
//如果只是直接使用if let会凭空多了一个分支,guard let可以降低分支的层次。一般在解包的时候guard let用的相对比较频繁。
print(nName + String(nAge))
}
关于if let和guard let的理解,可以参考guard和if的用法中的解释:根据关键字之后的表达式的布尔值决定下一步执行什么!
//eg:此处对于if let就不能整体理解,if后面跟了三个条件,let data = FileManager.default.contents(atPath: filePath)为条件一,persionAge > 18为条件二,persionAge < 60位条件三。因此按照guard和if关键字在官方文档的解释区理解才是正确的。
if let data = FileManager.default.contents(atPath: filePath), persionAge > 18, persionAge < 60 {
return User.user(data)
}
return nil
延伸:if 和if let
1.如果常量是可选项(Optional),if判断后仍然需要解包(!)
let name: String? = "老王"
let age: Int? = 10
if name != nil && age != nil {
print(name! + String(age!)) // 输出:老王10
}
2.如果常量是可选项(Optional),if let判断后不需要解包(!),{ }内一定有值
let name: String? = "老王"
let age: Int? = 10
// if let 连用,判断对象的值是否为'nil'
if let nameNew = name,
let ageNew = age {
// 进入分支后,nameNew 和 ageNew 一定有值
print(nameNew + String(ageNew)) // 输出:老王10
}