首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回语句中的IF LET与卫兵LET

返回语句中的IF LET与卫兵LET
EN

Stack Overflow用户
提问于 2017-08-29 11:02:02
回答 3查看 2.3K关注 0票数 2

查看具有相同代码的以下两种场景:

使用IF LET:

代码语言:javascript
复制
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的

代码语言:javascript
复制
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,他们都有着相同的目的,那么有什么区别,哪一个更好?

编辑:-

问题是关于一般语句的,可以使用它们中的任何一个,但是当我们有错误要处理时,最好使用哪一个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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一起使用。
票数 3
EN

Stack Overflow用户

发布于 2017-08-29 11:04:56

在此场景中,guard的使用使您的意图更加清晰--您只希望在没有错误的情况下执行该函数。

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

代码语言:javascript
复制
guard error != nil else { return }
... // continue with regular code

除此之外,guardif产生的结果也是一样的--这主要是品味的问题。

票数 3
EN

Stack Overflow用户

发布于 2017-08-29 11:07:03

警卫声明对处理“末日金字塔”非常有利。例如,我使用它的方式是键盘通知:

代码语言:javascript
复制
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)
}

如果没有卫士声明,它将有另一个意图,代码也不会如此清晰:

代码语言:javascript
复制
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)
        }
}

另一个很好的例子是验证:

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45937461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档