Swift 的 Guard 关键字

2023-12-07

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

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

    print("All good")
}

我想知道是否使用guard与使用老式方法(使用if健康)状况。它是否能提供您通过简单支票无法获得的好处?


Reading 本文我注意到使用有很大的好处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
}

如果您还有任何疑问,可以阅读整篇文章:迅速守卫声明。

包起来

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

这些未包装的值会留在您的其余部分中供您使用 代码块

.

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)")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 的 Guard 关键字 的相关文章

随机推荐

  • 共享 SD 卡中的图像

    我花了两周时间寻找如何共享存储在 SD 卡上的图像 但没有成功 This answer对我不起作用 也不是我正在寻找的 我正在与凸轮预览应用程序将图像存储到 SD 然后在应用程序内图库中显示它们 public class GalleryVi
  • 特定存储库的 Git 全局配置?

    意思是 有类似每个回购部分的东西 repo url 覆盖全局 不适用于特定存储库 选项 core filemode false editor notepad repo example com repo1 git core filemode
  • R 中的“错误恢复文件幻数”错误

    As in 加载 R 工作区时什么可能导致 错误的幻数 错误以及如何避免它 and R 有幻数 PNG 错误 我得到一个错误恢复文件幻数 error gt load fossilien dat Error bad restore file
  • 沙盒阻止我格式化字符串

    我有一个简单的常规脚本 node master echo I am about to try to use String format def jjj String format bob echo jjj 如果我将此脚本直接放入我的作业配置
  • GridLayout 未填充 JPanel

    我遇到 GridLayout 问题 并且整个 JPanel 未填充 我有一个 N M 网格 我用 N M 瓷砖填充它 它们扩展了 JPanel 添加所有这些图块后 JPanel 的底部和右侧仍然有空间 我认为 GridLayout 应该填满
  • Stateflow 在 reyclerview android kotlin 中引用整个数据

    嘿嘿我正在学习状态流在 Android 科特林中 我正在创建一个反向对话日历视图回收者视图 In my mainactivity有一个fragment 里面有我reyclerview 我的目标是做分页的东西 in my 回收者视图所以我先加
  • 使用 procf//status 了解进程状态

    我正在 Solaris 上工作 我知道如果有一个进程正在运行 就会有一个名为 proc
  • D lang - 在同一程序中使用 read 和 readln()

    我的 D 程序遇到了一个非常奇怪的问题 read s variable 本身工作得很好 而 readln variable 本身工作得很好 但是当我将两者放在一起时 readln 似乎被忽略了 使用 gdc 和 dmd 均发生错误 impo
  • 从头开始制作Android聊天应用程序

    我需要为Android 制作聊天应用程序 我想到使用PHP脚本来实现聊天应用程序 基本思想是将消息从android客户端发送到PHP脚本 并利用PHP脚本将消息发送到MySQL数据库 这些消息将广播给其他人 但问题是自动向其他人广播消息 有
  • 从列表列表中删除重复项

    我有一个Python列表列表 k 1 2 4 5 6 2 1 2 3 4 我想从中删除重复的元素 如果它是一个普通列表而不是我可以使用的列表set 但不幸的是 该列表不可散列 并且无法创建列表集 仅元组 所以我可以将所有列表转换为元组 然后
  • 如何创建文件下载按钮? 和 Axios 不工作

    我试图在我的个人网站上创建一个下载按钮 供人们下载我的 docx 简历 但遇到了一些问题 首先我用简单的 href 链接来做到这一点 a href xxx docx a
  • Jquery对话框按钮返回值

    我正在使用jquery对话框 我想要实现的是当用户按 确定 时 编程继续进行 当按 取消 时 它停止 function displaymessage confirm dialog buttons OK function this dialo
  • C# 中同步线程访问和写入

    我有一个用 C 编写的多线程端口扫描仪应用程序 我想在应用程序运行时将一些内容打印到控制台和日志文件 因此 我有以下帮助程序类 它可以很好地写入日志文件和控制台 public class Output private const strin
  • R data.table - 将函数 A 应用于某些列,将函数 B 应用于其他一些列

    我想聚合数据表的行 但聚合函数取决于列的名称 例如 如果列名称是 variable1 or variable2 然后应用mean 功能 variable3 然后应用max 功能 variable4 然后应用sd 功能 我的数据表总是有一个d
  • 带按钮的 Html 两种语言选项(无需重定向到不同页面)

    我正在尝试为网站提供第二语言选项 以下是该项目的详细信息 1 我并没有尝试使用谷歌翻译系统或任何其他自动翻译服务来更改整个网站语言 2 我只是想翻译网站中的主要描述部分 3 我已经编写并保存了描述文本的翻译版本 4 我还在一个单独的文件中制
  • 如何正确观察非标准事件?

    我是反应式扩展的新手 正在处理一个具有如下定义事件的 COM 库 public delegate void MyDelegate int requestId double price int amount public event MyDe
  • OSError:安装 h2o 时版本不匹配?

    我是 H2o 新手 总部设在文档我为 python 安装了 H2o pip install h2o Then In import h2o h2o init Out OSError Traceback most recent call las
  • 如何将无符号整数加载到 SIMD 中

    我有一个 C 程序 其中有一些无符号整数数组 我正在使用这个声明uint32 t 我想使用 SIMD 对每个数组中存储的数据执行一些操作 这就是我陷入困境的地方 因为看起来大多数 SSE 和 SSE2 函数只支持 float 和 doubl
  • 如何从动态范围中分割文本?

    我从 ERP 系统下载了一个很长的数据集 他们是管子 划定的 我必须将其拆分为单独的列 我可以用FILTERXML or TEXTSPLIT 将它们拆分为列 我试图动态使用 Textsplit 函数 以便如果有任何新数据到达末尾行 它会自动
  • Swift 的 Guard 关键字

    Swift 2 引入了guard关键字 可用于确保各种数据已配置就绪 我看到的一个例子这个网站演示了一个submitTapped函数 func submitTapped guard username text characters coun