使用相同的代码查看以下两个方案:
使用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)
}
}
使用GUARD 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
,两者都有相同的目的,然后哪些差异哪一个更好?
编辑: - 的
问题是一般性声明可以使用它们中的任何一个但是当我们有错误来处理哪一个最好用?
答案 0 :(得分:3)
在这种情况下guard
的使用使您的意图更加清晰 - 您只希望在没有错误的情况下执行该功能。
我最喜欢guard
的是它可以防止您深入嵌套if
括号,这使得代码更具可读性。在您的代码中,为了实现这一点,您可以将其设置为以下格式:
guard error != nil else { return }
... // continue with regular code
除了guard
和if
产生相同的结果 - 它主要是品味问题。
答案 1 :(得分:3)
首先,它们都没有正确实施。
peripheral.services!
services
如果if-let
为零,则会崩溃。guard
中删除它,一切都会正常工作if-let
优于if-else
的好处是减少guard
括号,从而产生更多可读代码 if-let
,考虑if-let
您只能在块内部使用展开的变量。guard-else
进行少量变量解包和在块范围外不需要的展开变量值error
在块范围外使用未包装的变量guard-else
对象(主要使用保护块),请使用if-let
,否则请使用{{1}}。答案 2 :(得分:2)
Guard语句非常适合处理“厄运金字塔”。我使用它的方式是例如键盘通知:
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
}