Swift Guard是swift 2.0的时候推出的,网上有很多关于Guard语句的介绍,但是让人看了一知半解,Guard与If语句的区别在于它能够轻松的解包,避免if let语句的金字塔困扰,后面会用两个案例来介绍if语句造成的这种现象。
Swift什么时候会用到Guard语句呢?
如果你有一个带有一些UITextField元素或其他类型用户输入的视图控制器,你会立即注意到textField.text获取的值很可能为NULL空值,而你不想将空值提交到服务器后端,这个时候你就需要用if let做isEmpty是否为空的判断,你会想到有以下两种方式来解决:
方式一:用if let做判断,然后向后台服务器传递参数,如下所示,这就是一款正宗的金字塔语句:
func submit() {
if let name = nameField.text {
if let address = addressField.text {
if let phone = phoneField.text {
sendToServer(name: name, address: address, phone: phone)
} else {
show("no phone to submit")
}
} else {
show("no address to submit")
}
} else {
show("no name to submit")
}
}
//向后台提交数据
func sendToServer(name: String, address: String, phone: String) {
...
}方式二:用if...else语句来判断这些需要提交的字段是否为空,如下:
func submit() {
let username = "";
let addr = "";
let pho = "";
if let name = nameField.text {
username = name;
} else {
show("no name to submit")
}
if let address = addressField.text {
addr = address;
} else {
show("no address to submit")
}
if let phone = phoneField.text {
pho = phone;
} else {
show("no phone to submit")
}
//向后台提交数据
sendToServer(name:username, address: addr, phone: pho)
}
func sendToServer(name: String, address: String, phone: String) {
...
}如果按照上面那两种方式向后台提交数据的话,会显得很麻烦,这个就是因为语句没有解包,所以我们不得不把向后台提交数据的方法写在if let里面,或者用if else语句重新赋值给一些变量,然后在外面调用sendToServer()提交这些变量数据。
这个时候我们就可以直接用Swift Guard语句来解决,提交数据的方法就可以直接放在Guard判断方法外面了,如下:
func submit() {
guard let name = nameField.text else {
show("No name to submit")
return
}
guard let address = addressField.text else {
show("No address to submit")
return
}
guard let phone = phoneField.text else {
show("No phone to submit")
return
}
//向后台提交数据,方法写在外面仍然能获取到判断之后的值!
sendToServer(name: name, address: address, phone: phone)
}
func sendToServer(name: String, address: String, phone: String) {
...
}经过swift Guard之后,我们的语句就相当于简洁了不少,而且不需要做额外的判断,有值就直接赋值了,非常的方便。