Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios IF LET vs GUARD LET中的Return语句_Ios_Swift3 - Fatal编程技术网

Ios IF LET vs GUARD LET中的Return语句

Ios IF LET vs GUARD LET中的Return语句,ios,swift3,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.se

请看以下两个代码相同的场景:

使用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)
        }
}
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
        guard let _ = error else{
            for service in peripheral.services!
            {
                print("discovered service is ::::",service)
            }
        return
       }
    }
使用保护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)
        }
}
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
        guard let _ = error else{
            for service in peripheral.services!
            {
                print("discovered service is ::::",service)
            }
        return
       }
    }
他们都使用
返回语句
,两个语句的用途相同。那么有什么区别,哪一个更好?

编辑:-


问题是对于一般性陈述,使用其中任何一个都可以,但当我们处理错误时,哪一个最好使用?

在这种情况下使用
guard
可以让您的意图更清楚,您只希望在没有错误的情况下执行函数

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

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

除此之外,
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)
}
如果没有guard语句,它将有另一个意图,代码也不会如此干净:

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
}

首先,它们都没有得到适当的实施

  • peripheral.services中如果
    服务
    将为零,它将崩溃
  • Return语句-这两种语句都不需要返回,如果let,只需将其从
    中删除,一切都会正常工作
  • guard
    优于
    if-let
    的好处是它减少了
    if-else
    括号,从而产生更多的可读代码
  • 使用
    guard
    如果您关心块范围外变量的值,请考虑
    如果let
    您只能在块内使用未包装变量
  • 如果让用于少量变量展开,则使用
    ,并且在块范围外不需要展开变量的值
  • 使用
    guard else
    在块范围外使用未包装变量
  • 如果要使用块范围外的
    error
    对象(主要使用保护块),则使用
    guard else
    否则使用
    If let

这是一个奇怪的函数,传入这样的错误。正因为如此,它不太适合这种比较。@Shubham Mishra guard let的另一个优点是,它还提供了break的用法,主要目的是保持代码的干净性和可读性。问题是对于一般的语句来说,它是可以的,但当我们在处理什么是最佳用法时出现错误?@ShubhamMishra这是您想要的选择。在引入警卫let之前,我们使用if-let。但是这使得代码看起来很复杂,大量嵌套和{}的额外使用。guard let解决了这一问题。用例与处理零值崩溃相同,但也有助于保持代码的干净性和可理解性。如果错误不为零,则只有服务为零,并且错误检查已经完成。情况并非总是如此,因为
服务
是可选的,所以您应该用
打开它,如果让它
保护其他
得到它,但问题是一般声明,它是好的,但当我们处理错误时,哪一个最好使用?问题是一般声明,它是好的,但当我们处理错误时,什么是最好使用的?这取决于,您可以使用if和guard实现所有功能。这只是为了使代码更干净。问题是对于一般语句来说,这是可以的,但当我们处理错误时,最好使用什么呢?