swift中guard和if小结

共同点

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

语法

if的简单使用

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

gaurd的简单使用

guard !name.isEmpty else {
    show("名字是空")
    return
}
doSomething()
  • 从语法特点上来看,if满足条件要执行的代码放在前面的闭包内,不满足条件要执行的代码放在else的闭包内;guard不满足条件要执行的代码放在else的闭包内,满足条件要执行的代码放在guard语句的后面,不用放在guard的任何闭包中
  • guard有一个很大的特点,在else闭包中必须跟一个中断往后执行的关键字或者方法等,如return、continue、break、fatalError、throw等,这里有些同学有一个很大的误区,认为else闭包里只能用return

什么时候适合用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代码不便于阅读理解和结构不清晰的问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容