斯威夫特:使用保护声明的好处?

时间:2019-12-25 08:53:18

标签: ios swift

仅了解Swift guard关键字,我想知道它将实现什么优势。

例如,假设我有以下代码:

func getEmail(email: String?) -> String {
    guard email != "" else {
        return ""
    }
    return email! + "@somewhere.com"
}

print(getEmail(email: "test123"))

我可以写...

if email == "" {
    return ""
}
return email! + "@somewhere.com" 

...也是。

那么拥有保护关键字有什么好处?

是不是只有一点点语法糖?

5 个答案:

答案 0 :(得分:8)

我不认为这是使用守卫的一个很好的例子,更常见的是将其与可能为nil(又称可选)的变量或可能返回nil的函数一起使用。建议您阅读Swift Programming Language书中的保护声明(只需向下滚动至“提前退出”)

我们可以从您的代码中得到一个更好的示例,该示例缺少一些验证

func getEmail(email: String?) -> String? {
    guard let input = email, !input.isEmpty  else {
        return nil
    }

    return input + "@somewhere.com"
}

在这里,我们将参数email分配给局部变量input,以使用警惕来检查其是否为nil。如果为nil,该函数将返回nil,否则它将检查是否为空,然后也将返回。

如果可以,该功能将继续并创建并返回电子邮件地址。请注意,该函数被声明为返回可选字符串,因为我认为这样的函数如果失败则返回nil而不是空字符串,这样会更清楚。

答案 1 :(得分:3)

Guard语句是早期退出语句,guard语句的主要用途是在某些条件下将程序控制权移出范围。这些语句与if语句基于某些条件执行语句相似,但与if语句不同的是,guard语句仅在不满足某些条件时运行。 我强烈建议您阅读本文Swift guard statement

答案 2 :(得分:1)

我认为对于电子邮件ID来说没有好处,

  

但是请考虑一个示例,该示例在学生中具有某个功能,   对于一个学生,您必须执行一些关键操作,但是如果   学生不存在,那么做任何事情都是没有意义的   你早就来到这里,可以使用守卫   声明。

let student = studentArr.filter{$0.id == "1234"}

guard let stdnt = student[0], stdnt != nil  else {
    return nil
}

// calculate marks of this student for all years' maths subject to prepare analytics

答案 3 :(得分:1)

如果您的代码需要决定是否提前退出,则可以使用Guard构造。保护声明由条件和else块组成。 else 块必须通过Swift提供的任何方式离开当前范围,例如 return break 继续抛出致命错误。如果条件失败,则绝对不会在包含防护构造的块内继续执行。大多数情况下,该构造用于检查可选值,类似于 if let 语句。与 if let 和/或 while let 不同, guard let 不声明嵌套范围的绑定变量,而是为范围。伙计们给出了很好的例子,说明了他们的答案。我也想更多关注其他可能的情况。

防护构造也可以与 try? 结合使用。假设除非 String(contentsOfFile:)成功,否则我们将无法继续。然后我们可以执行以下操作:

guard let text = try? String(contentsOfFile: path) else {return}

还有一个 警卫案 构造,构成 if case 的逻辑逆,例如:

guard case let .number(n) = error else { return }

还有一个更有趣的问题,可以使用 guard case 构造解决。假设我们有一个函数,要在 guard 语句中检查其返回值:

guard howMany() > 10 else { return }

一切看起来不错,但是假设在下一行中您想使用该函数返回的值。您可能不希望再次调用该函数,因为这可能很耗时或可能有任何副作用。您无法捕获使用 guard let 调用该函数的结果,因为这需要一个Optional,而函数 howMany()不会返回Optional。 在这种情况下,可以通过以下方式使用 guard case 构造:

guard case let amount = howMany(), amount > 10 else { return }

答案 4 :(得分:1)

  

如果让与守卫让我们服务于相似但截然不同的目的。

     

后卫的“其他”情况必须退出当前范围。通常来说   表示必须调用return或中止程序。守卫习惯   提供早期回报,而无需嵌套其余的   功能。

     

if let嵌套其作用域,并且不需要任何特殊的内容。   它可以返回还是不返回。

     

通常,如果if-let块将是其余的   函数,否则它的else子句中将有返回或中止,然后   您应该改用警卫。这通常意味着(至少在我   经验),如果有疑问,通常最好选择后卫。但   在很多情况下,让它仍然合适。