Swift 集

Swift 中 guard 和 if 小结

2022-09-02  本文已影响0人  Swift社区

共同点

都是用于流程控制的关键字,都能做到满足条件做某事,不满足条件做另外一件事

语法

if的简单使用

if !name.isEmpty {
    doSomething()
} else {
    show("名字是空")
}

gaurd的简单使用

guard !name.isEmpty else {
    show("名字是空")
    return
}
doSomething()

什么时候适合用guard

1、多个optional解包,并且需要都满足条件,比如做登录功能的时候

使用if做的两种方式: 方式1:

if let username = usernameTextField.text, !username.isEmpty {
    if let password = passwordTextField.text, !password.isEmpty {
        register(username, password)
    } else {
        show("密码不能为空")
    }
} else {
    show("用户名不能为空")
}

方式2:

if let username = usernameTextField.text, !username.isEmpty, let password = passwordTextField.text, !password.isEmpty {
    register(username, password)
} else {
    show("用户名和密码不能为空")
}

这两种方式的缺点:方式1中存在多重嵌套,如果不止用户名和密码,还有其他的,嵌套更深;方式2中if后面跟的语句过长,不方便阅读和理解,结构不清楚

使用guard怎么做:

guard let username = usernameTextField.text, !username.isEmpty else {
    show("用户名不能为空")
    return
}

guard let password = passwordTextField.text, !password.isEmpty else {
    show("密码不能为空")
    return
}
register(username, password)

使用guard结构清晰,方便阅读和理解,并且不造成嵌套

2、中断当前流程,当不满足条件时,不需要执行后面的逻辑,比如校验手机号码是否正确

使用if

func verifyMobilePhoneNumber(_ phoneNumber: String) -> Bool {
    if phoneNumber.isEmpty {
        return false
    }
    /// 检验逻辑。。。
}

使用guard

func verifyMobilePhoneNumber(_ phoneNumber: String) -> Bool {
    guard !phoneNumber.isEmpty {
        return false
    }
    
    /// 检验逻辑。。。
}

if、guard都能满足功能,但是guard的优势就在于,看到guard 中的条件,就知道不满足条件,就要中断当前流程,而使用if,还要去看if对应闭包的内容,才能判断是否中断流程,这里例子简单,看不出太多优势,当逻辑比较复杂后,guard在这里的优势就体现出来了

什么时候用if,而不能用guard

当满足条件做某事,然后继续做后面的事,比如打扫卫生,张三扫地,然后拖地,李四檫黑板,然后拖地,其他同学拖地

func cleanClassroom(name: String) {
    if name == "张三" {
        sweepTheFloor()
    }
    
    if name == "李四" {
        cleanTheBlackboard()
    }
    
    mopTheFloor()
}

很明显这里只能用if,不能用guard

总结

guard的优势在于,else闭包中必须使用中断当前流程的语句,并且满足条件要执行的代码不用放在guard的任何闭包中 使用guard能解决一些if嵌套问题和一些if代码不便于阅读理解和结构不清晰的问题

上一篇下一篇

猜你喜欢

热点阅读