小编典典

Swift 的 guard 关键字

all

Swift 2
引入了guard关键字,可用于确保各种数据配置就绪。我在这个网站上看到的一个例子演示了一个
submitTapped 函数:

func submitTapped() {
    guard username.text.characters.count > 0 else {
        return
    }

    print("All good")
}

我想知道 usingguard与使用条件的老式方式是否有任何不同if。它是否提供了使用简单检查无法获得的好处?


阅读 91

收藏
2022-07-06

共1个答案

小编典典

阅读这篇文章,我注意到使用 Guard 的巨大好处


这里你可以用一个例子来比较一下guard的使用:

这是没有保护的部分:

func fooBinding(x: Int?) {
    if let x = x where x > 0 {
        // Do stuff with x
        x.description
    }

    // Value requirements not met, do something
}
  1. 在这里,您可以将所需的代码置于所有条件中

您可能不会立即看到这个问题,但是您可以想象如果它嵌套在运行语句之前需要满足的众多条件中会变得多么混乱

清理这个问题的方法是先做你的每一个检查,如果有任何不符合就退出。这可以很容易地理解什么条件会使这个函数退出。

但是现在我们可以使用guard,我们可以看到可以解决一些问题:

func fooGuard(x: Int?) {
    guard let x = x where x > 0 else {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
    x.description
}
  1. 检查您想要的条件,而不是您不想要的条件。这又类似于断言。如果条件不满足,则运行guard、荣else语句,跳出函数。
  2. 如果条件通过,这里的可选变量会在保护语句被称为“在这种情况下为 fooGuard(_:) 函数的范围内”自动为您解包。
  3. 您正在及早检查不良情况,使您的函数更具可读性和更易于维护

同样的模式也适用于非可选值:

func fooNonOptionalGood(x: Int) {
    guard x > 0 else {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
}

func fooNonOptionalBad(x: Int) {
    if x <= 0 {
        // Value requirements not met, do something
        return
    }

    // Do stuff with x
}

如果您还有任何疑问,您可以阅读整篇文章:Swift guard statement。

包起来

最后,阅读和测试我发现如果你使用 guard 来解开任何选项,

那些未包装的值留待您在代码块的其余部分中使用

.

guard let unwrappedName = userName else {
    return
}

print("Your username is \(unwrappedName)")

此处未包装的值仅在 if 块内可用

if let unwrappedName = userName {
    print("Your username is \(unwrappedName)")
} else {
    return
}

// this won't work ...unwrappedName doesn't exist here!
print("Your username is \(unwrappedName)")
2022-07-06