Swift:guard let 和 where - 优先级

2024-03-21

有时,我想用guard结合let & where简化我的代码。但我想知道 let 的优先级是什么以及在哪里。例如:

class Person {
    func check() -> Bool? {
        print("checking")
        return nil
    }
}

func test(dont: Bool) {
    let person = Person()
    guard let check = person.check() where dont else {
        print("should not check")
        return
    }
    print("result: \(check)")
}


test(false)

正如您所看到的控制台结果,打印输出为:

  • checking
  • 不应该检查

对于条件为let check = person.check() where dont in guard <condition> else { }语法,甚至表达式where与表达式的结果无关let, Swift 似乎执行let首先然后检查where之后。有时在我的代码中,let可选绑定需要大量计算where只是一个简单的条件,不依赖let结果,我应该移动where out of guard?或者我对优先级或 let & where 的理解是错误的?


你是对的,在你的Swift 2 code

guard let check = person.check() where dont else { }

条件绑定let check = ...首先检查,并且仅当成功时,才检查布尔条件dont已检查。您可以使用

guard dont, let check = person.check() else { }

首先检查布尔条件。

语法中的这种“不对称”已在Swift 3:所有保护子句均以逗号分隔where不再使用关键字。所以你有了

guard let check = person.check(), dont else { }
// or
guard dont, let check = person.check() else { }

从左到右短路检查条件, 即,如果一个条件失败,则执行 else 块,而无需 检查剩余条件。

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

Swift:guard let 和 where - 优先级 的相关文章

随机推荐

  • 如何使用 Scala 的 DataFrame 比较表中的每一列

    有两张桌子 一张是ID表1 一张是属性表2 Table 1 Table 2 如果表1中同一行的ID具有相同的属性 则得到数字1 否则得到0 最终得到结果表3 Table 3 例如 id1和id2具有不同的颜色和大小 因此id1和id2行 表
  • 如何在jQuery中选择所有本地链接

    我需要选择所有本地链接 无论是否以 path to page http mydomain com path to page https mydomain com path to page 并将它们替换为 path to page 感谢您的帮
  • 在仅附加表中设置版本列

    我们有一个表来存储记录的版本 这些列是 Id Guid VersionNumber int Title nvarchar Description nvarchar etc 保存项目将在表中插入具有相同 ID 和增量版本号的新行 我不确定如何
  • 如何使用attachEvent引用调用者对象(“t​​his”)

    使用方法 attachEvent 在 IE 中 如何引用调用者对象 触发事件的元素 this In normal浏览器 使用 addEventListener 变量this指向元素 而在 IE 中它指向window object 我需要它与
  • Visual Studio 2013 Update 2 无法打开 cshtml

    我安装了新的 VS2013 Update 2 只要我打开 cshtml 文件 VS 就会崩溃 I tried 修复VS 停用所有扩展 devenv exe ResetSkipPkgs 重置所有设置 没有成功 安装 Xamarin 后我遇到了
  • 用Python写的3D OpenGL游戏能好看又运行快吗?

    我计划使用 jMonkeyEngine 在 Java 中编写一个简单的 3D 等轴测视图 游戏 没什么好看的 我只是想学习一些有关 OpenGL 的知识并编写高效的算法 随机地图生成算法 当我计划要做什么时 我开始考虑是否要转向 Pytho
  • System.IdentityModel 和 Microsoft.IdentityModel 之间有什么区别,我应该使用哪一个?

    我刚刚开始尝试编写一个联合声明提供程序 我正在使用http claimsid codeplex com http claimsid codeplex com 示例作为我的模板 因此 我启动 VS2010 开始我自己的项目 我注意到的第一件事
  • Bootstrap 中心导航栏项目

    我知道我可以将导航栏项目向左和向右推送 但如何将它们居中呢 text align center 不起作用 也没有我想到的任何其他事情 您将需要修改导航栏组件的一些 CSS 规则 所以添加一个类center to nav navbar以及以下
  • Sql 视图的流畅 Nhibernate 映射

    我在 asp net mvc3 和 c 中使用 Fluent Nhibernate 我正在按以下方式工作来生成和映射一个类 Mapping using FluentNHibernate Mapping using Com Web Domai
  • 如何使用 Gradle 2.0 下载 javadoc 和 jar 源?

    我正在使用 Gradle 2 0 我应该写什么build gradle这样 javadocs 和源代码也会与 jar 一起下载吗 我猜您的问题与开发工作区有关 以下链接解释了如何使用 IDE 插件在 Gradle 中添加所需的配置 For
  • Android:使用 MotionEvent 在自定义 ViewGroup 中对视图进行拖放定位

    我在创建的自定义 ViewGroup 上定位视图元素时遇到问题 特别是在拖放情况下 我的目标是 Android 2 2 及更高版本 因此我无法真正使用 Android 3 中出现的拖放 API 我的自定义 ViewGroup 称为 Node
  • 如何一般性地比较整个java bean?

    我一直在尝试使用 org apache commons beanutils 库来获取方法 习惯用法来评估相等性all两个实例之间的属性 即 bean 的通用 equals 方法 有没有一种简单的方法可以使用这个库来做到这一点 或者我以错误的
  • MySQL - 将用户排在最高分列表中

    我有一个 MySQL 查询 它选择我的成绩中排名前 3 的球员users表 然后创建一个额外的列 其中分配了它们的排名 SELECT s curRank curRank 1 AS rank FROM users AS s JOIN SELE
  • 如何在 SQL 中更新/插入指定日期范围内的随机日期

    请原谅我 我是一个绝对的新手 我需要 phpmyadmin 中这张表的帮助 我的表有以下列 Primary ID Begin Date End Date Timestamp 如何在 phpmyadmin 中更新具有指定日期范围 例如 一个月
  • 在 C++ 纯虚函数上应用“using”关键字

    B 类重写了 A 类的纯虚函数 print C 类继承了 B 类并具有 using A print 语句 那么为什么 C 类不是抽象类呢 class A public virtual void print 0 class B public
  • 仅在多索引中的第二个索引上使用 .loc

    我有多索引数据框 如下所示 value year name 1921 Ah 40 1921 Ai 90 1922 Ah 100 1922 Ai 7 其中year and name是指数 我想选择名称所在的每一行Ai出现 我努力了df loc
  • 通用 C++ 多维迭代器

    在我当前的项目中 我正在处理多维数据结构 底层文件按顺序存储 即一个巨大的数组 没有向量的向量 使用这些数据结构的算法需要知道各个维度的大小 我想知道是否已在某处以通用方式定义了多维迭代器类 以及是否有任何标准或首选方法来解决此问题 目前
  • 如何在 Kendo 菜单中检索 id 值

    我在我的项目中使用 Kendo 菜单 我想在单击所选项目时检索 id 值 我使用了 onSelect 事件 并且能够检索所选项目的文本 如何检索 id 值 您可以使用 HTML5 数据属性来完成此操作 HTML div class k co
  • python多处理池解释器中的断言错误

    我正在编写一个示例程序来测试 python 2 7 2 中工作线程多处理池的使用情况 这是我在 python ubuntu 解释器中编写的代码 gt gt gt from multiprocessing import Pool gt gt
  • Swift:guard let 和 where - 优先级

    有时 我想用guard结合let where简化我的代码 但我想知道 let 的优先级是什么以及在哪里 例如 class Person func check gt Bool print checking return nil func te