共同点
都是用于流程控制的关键字,都能做到满足条件做某事,不满足条件做另外一件事
语法
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代码不便于阅读理解和结构不清晰的问题