仅了解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"
...也是。
那么拥有保护关键字有什么好处?
是不是只有一点点语法糖?
答案 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子句中将有返回或中止,然后 您应该改用警卫。这通常意味着(至少在我 经验),如果有疑问,通常最好选择后卫。但 在很多情况下,让它仍然合适。