IF LET中的退货声明与GUARD LET

时间:2017-08-29 11:02:03

标签: ios swift3

使用相同的代码查看以下两个方案:

使用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,两者都有相同的目的,然后哪些差异哪一个更好?

编辑: -

问题是一般性声明可以使用它们中的任何一个但是当我们有错误来处理哪一个最好用?

3 个答案:

答案 0 :(得分:3)

在这种情况下guard的使用使您的意图更加清晰 - 您只希望在没有错误的情况下执行该功能。

我最喜欢guard的是它可以防止您深入嵌套if括号,这使得代码更具可读性。在您的代码中,为了实现这一点,您可以将其设置为以下格式:

guard error != nil else { return }
... // continue with regular code

除了guardif产生相同的结果 - 它主要是品味问题。

答案 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
}