swift之if let和guard let
2024-04-10 05:20:35  阅读数 2193

对于一些可选值,一般最好经过判断之后确定其不为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
}