defer 语句和 return 之前的语句有什么区别?

2023-12-26

这有什么区别:

_ = navigationController?.popViewController(animated: true)

defer {
    let rootVC = navigationController?.topViewController as? RootViewVC
    rootVC?.openLink(url: url)
}
return

和这个:

_ = navigationController?.popViewController(animated: true)

let rootVC = navigationController?.topViewController as? RootViewVC
rootVC?.openLink(url: url)
return

Apple 的 swift 指南指出:“您可以使用 defer 语句在代码执行离开当前代码块之前执行一组语句。 ”,但我还是不太明白。


defer 语句和 return 之前的语句有什么区别?

世界上所有的差异。这defer语句被执行after回报!这使您能够完成其他方式无法完成的事情。

例如,您可以返回一个值并then更改值。苹果公司经常使用这个技巧。例如,这里是序列文档中的代码,显示如何编写自定义序列:

struct Countdown: Sequence, IteratorProtocol {
    var count: Int

    mutating func next() -> Int? {
        if count == 0 {
            return nil
        } else {
            defer { count -= 1 }
            return count
        }
    }
}

如果你把它写成

            count -= 1
            return count

...它会破裂;我们不想减少count然后返回它,我们要返回count然后递减它。

另外,正如已经指出的那样,defer语句无论如何都会被执行how你退出。无论您退出当前状态,它都会起作用scope,这可能不涉及return根本没有;defer适用于函数体、while 块、if 构造、do 块等。单个return并不是退出此类范围的唯一方法!可能有不止一个return在你的方法中,和/或你可能会抛出一个错误,和/或你可能有一个break等等,或者您可能会自然地到达范围的最后一行;这defer在每种可能的情况下都会执行。 “手动”编写相同的代码以覆盖每个可能的出口可能非常容易出错。

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

defer 语句和 return 之前的语句有什么区别? 的相关文章

随机推荐

  • 有人可以向我解释一下匿名方法吗?

    Delphi 2009 中还有一些很酷的东西 其中之一就是新增了匿名方法 我已经看过有关匿名方法的示例和博客文章 但我还没有明白 有人能解释一下为什么我应该感到兴奋吗 请看一下closures http en wikipedia org w
  • Android Drawable:在 XML 文件中以百分比形式指定形状宽度?

    我正在尝试创建一个简单的 Drawable 我想将其设置为视图的背景 使用设置背景Drawable 我只是想将可绘制的背景分成两个相等的矩形 50 50 第一个要填充黑色 第二个要填充白色
  • 使用 cplex 在 java 中定义二元决策变量

    我正在尝试使用 cplex 在 java 中定义二元决策变量 这是一个二维变量 这意味着如果一条路径从特定站点开始 则它应该为 1 否则为 0 我有一组站点 J 和一组路径 K 我的决策变量是 Z jk 目前我正在定义如下代码 但它不起作用
  • Perl chdir 不起作用

    之前的一篇文章可能有用 Perl system 调用失败 返回代码 65280 https stackoverflow com questions 11989196 perl system call failed with return c
  • 如何在 NativeScript 中访问 Google Play 服务

    我目前正在从 NativeScript 开始 我正在尝试将某些 Google Play 服务包含到 android 项目中 我将相关的 aar 文件放入我的应用程序项目的 node modules 文件夹中并构建它 我可以看到它们已成功添加
  • 将 mongo 中的大写字母更改为驼峰式大小写?

    我有一个名为 User 的集合 其中包含字段 FirstName 和 SecondName 但数据是大写字母 firstName FIDO secondName JOHN 我想知道是否可以将字段制作成骆驼箱 firstName Fido s
  • 打印 `awk` 中的倒数第二列/字段

    我想打印倒数第二列或字段awk 字段的数量是NF多变的 我知道我应该能够使用 NF 但我不确定如何使用它 这似乎不起作用 awk print NF awk print NF 1 应该管用
  • 使用 SQL*Loader 更新表中的列

    我编写了一个具有以下查询的 SQL 脚本 查询工作正常 update partner set is seller buyer 1 where id in select id from partner where names in A B C
  • 将字母转换为数字

    我想将字母 A 更改为点 1 将字母 Z 更改为数字 26 然后再次更改为数字 27 字母 AA AB 更改为 28 我该怎么办 我必须使用 开关 吗 我使用java程序 没有对此进行测试 但按照这些思路应该可以工作 public Stri
  • 在 Play 2.0 中设置自定义根 URL

    我有一个 play 应用程序 如果它是 Web 主机的根目录 则可以运行 但是我想将其作为主机的子 URL 加载 That is http example com lt This works fine and i want to move
  • 求助......串口编程

    我想用 python 与我的串口进行通信 我为linux安装了pyserial和uspp 尽管如此 当我运行以下代码时 import serial ser serial Serial dev pts 1 19200 timeout 1 pr
  • 如何改变CSS中的删除线/穿线粗细?

    我正在使用text decoration line through在 CSS 中 但我似乎找不到任何方法来改变线条粗细 而不需要像 hr 或图像叠加 有没有优雅的方法来指定穿线的粗细 现代的解决方案是使用文字装饰厚度 https devel
  • 在 MAMP 上安装 PEAR

    我正在使用 MAMP 进行开发 我一直无法让 PEAR 工作 MAMP 文档和论坛似乎没有答案 在MAMP论坛上提问的人似乎都没有回复 以前我在 MAMP 上开发了系统 并且只使用 PEAR 来处理邮件 所以我让它在服务器上运行一次 而不是
  • 浏览器 JavaScript 是否允许 SIMD 或矢量化操作?

    我想用 JavaScript 编写需要大量数值计算的应用程序 然而 我对客户端 JavaScript 中类似线性代数的高效计算的状态感到非常困惑 似乎有很多方法 但没有明确表明它们已准备就绪 其中大多数似乎对允许计算的向量和矩阵的大小有限制
  • 将变量保存在文本文件中

    我想将变量 包括其值 保存到文本文件中 以便下次打开程序时 任何更改都会自动保存到文本文件中 例如 balance total savings total expenses 我将如何将变量本身保存到文本文件中 而不仅仅是其值 此部分用于注册
  • 如何将 JPEG 图像转换为具有透明背景的 PNG 图像?

    我有一个 JPEG 格式的图像 带有白色背景和黑色圆圈 如何将此图像转换为 PNG 格式 使白色背景透明 黑色保留在那里 我也是一名程序员 如果 C 代码中有一些想法我会很高兴 我也在寻找转换器 工具 程序等任何东西 谢谢 Jeff 这是可
  • 如何将 Visual Studio 2005 的平台工具集添加到较新 IDE 版本的“平台工具集”列表中?

    我已经安装了 Visual Studio 2005 2015 我要使用 Visual Studio 2005 的平台工具集 但列表中没有这个变体 如何将Visual Studio 2005的平台工具集添加到Platform Toolset较
  • 如何在 Spark 中将 RowMatrix 更改为数组或将其导出为 CSV?

    我在 Scala 中有这样的代码 val mat CoordinateMatrix new CoordinateMatrix data val rowMatrix RowMatrix mat toRowMatrix val svd Sing
  • 在 Woocommerce 中保存并显示订单项自定义元数据

    我有一些自定义代码工作得很好 自从我将 Woocommerce 更新到版本 3 5 2 后 它就不再工作了 不确定是因为我更改了 WordPress 主题还是因为插件更新了 我的问题是自定义字段的值不会出现在 woocommerce 的订单
  • defer 语句和 return 之前的语句有什么区别?

    这有什么区别 navigationController popViewController animated true defer let rootVC navigationController topViewController as R