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之后,我们的语句就相当于简洁了不少,而且不需要做额外的判断,有值就直接赋值了,非常的方便。