查看具有相同代码的以下两种场景:
使用IF LET:
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
if let error = error {
print("error: \(error.localizedDescription)")
return
}
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
}使用保护LET的:
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
guard let _ = error else{
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
return
}
}他们两人都在使用return statement,他们都有着相同的目的,那么有什么区别,哪一个更好?
编辑:-
问题是关于一般语句的,可以使用它们中的任何一个,但是当我们有错误要处理时,最好使用哪一个?
发布于 2017-08-29 11:15:01
首先,它们都没有得到适当的执行。
peripheral.services!中,如果services为零,它就会崩溃。if-let中删除它,一切都将正常工作。guard相对于if-let的好处是它减少了if-else括号,从而增加了可读的代码guard,考虑if-let,您只能在块内使用未包装的变量。if-let。guard-else在块范围外使用未包装变量error对象(主要使用保护块),则与guard-else一起使用,否则与if-let一起使用。发布于 2017-08-29 11:04:56
在此场景中,guard的使用使您的意图更加清晰--您只希望在没有错误的情况下执行该函数。
我最喜欢guard的地方是,它防止您深入嵌套if括号,从而使代码更具可读性。但是,在您的代码中,为了实现这一点,您可以将其设置为如下格式:
guard error != nil else { return }
... // continue with regular code除此之外,guard和if产生的结果也是一样的--这主要是品味的问题。
发布于 2017-08-29 11:07:03
警卫声明对处理“末日金字塔”非常有利。例如,我使用它的方式是键盘通知:
func keyboardWillShowSelector(notification:NSNotification) {
guard let userInfo = notification.userInfo else { return }
var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
keyboardFrame = self.view.convert(keyboardFrame, from: nil)
let height = keyboardFrame.size.height
keyboardWillShow(withHeight: height)
}如果没有卫士声明,它将有另一个意图,代码也不会如此清晰:
func keyboardWillShowSelector(notification:NSNotification) {
if let userInfo = notification.userInfo {
var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
keyboardFrame = self.view.convert(keyboardFrame, from: nil)
let height = keyboardFrame.size.height
keyboardWillShow(withHeight: height)
}
}另一个很好的例子是验证:
private func errorFromInputValidation(name: String, email: String, password1: String, password2: String) -> String? {
guard password1 != "" && password2 != "" && email != "" && name != "" else { return Localizable.fieldsCannotBeEmpty.localized }
guard password1 == password2 else { return Localizable.passwordsAreNotEqual.localized }
return nil
}https://stackoverflow.com/questions/45937461
复制相似问题