Swift @escaping 和完成处理程序

2024-04-16

我试图更准确地理解 Swift 的“闭包”。

But @escaping and Completion Handler太难理解了

我查了很多Swift的帖子和官方文档,但感觉还是不够。

这是官方文档的代码示例

var completionHandlers: [()->Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
    completionHandlers.append(completionHandler)
}

func someFunctionWithNoneescapingClosure(closure: ()->Void){
    closure()
}

class SomeClass{
    var x:Int = 10
    func doSomething(){
        someFunctionWithEscapingClosure {
            self.x = 100
            //not excute yet
        }
        someFunctionWithNoneescapingClosure {
            x = 200
        }
    }
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)

completionHandlers.first?() 
print(instance.x)

我听说有两种使用方法和原因@escaping

第一个是用于存储闭包,第二个是用于异步操作目的。

以下是我的问题:

首先,如果doSomething然后执行someFunctionWithEscapingClosure将使用闭包参数执行,并且该闭包将保存在全局变量数组中。

我认为闭包是 {self.x = 100}

How self在保存在全局变量中的 {self.x = 100} 中completionHandlers可以连接到instance那个对象SomeClass ?

二、我的理解someFunctionWithEscapingClosure像这样。

存储局部变量闭包completionHandler到全局变量“完成处理程序”we using@escaping`关键字!

without @escaping关键词someFunctionWithEscapingClosure返回,局部变量completionHandler将从内存中删除

@escaping就是将这个闭包保留在内存中

这是正确的吗?

最后,我只是想知道这个语法的存在。

也许这是一个非常初级的问题。

如果我们希望某个函数在某个特定函数之后执行。为什么我们不在特定函数调用之后调用某个函数呢?

使用上述模式和使用转义回调函数有什么区别?


Swift 完成处理程序转义和非转义:

假设用户在使用应用程序时正在更新它。你一定想要 完成后通知用户。您可能想弹出一个框 上面写着:“恭喜你,现在你可以尽情享受了!”

那么,如何仅在下载完成后运行一段代码呢? 完全的?此外,如何仅在 视图控制器已移至下一个?嗯,我们会发现 了解如何像老板一样设计一个。

根据我广泛的词汇表,完成处理程序代表

当事情完成后再做事情

Bob 的帖子清晰地介绍了完成处理程序(从开发人员的角度来看,它准确地定义了我们需要理解的内容)。

@转义闭包:

当在函数参数中传递闭包时,在函数体执行后使用它并返回编译器。当函数结束时,传递的闭包的范围存在并存在于内存中,直到闭包被执行。

有几种方法可以在包含函数中转义闭包:

  • 存储:当您需要将闭包存储在全局变量、属性或存在于调用函数过去的内存中的任何其他存储中时,将执行并返回编译器。

  • 异步执行:当您在调度队列上异步执行闭包时,队列会为您将闭包保存在内存中,以便将来使用。在这种情况下,您不知道闭包何时执行。

当您尝试在这些场景中使用闭包时,Swift 编译器将显示错误:

为了更清楚地了解这个主题,您可以查看这篇文章发表在 Medium 上 https://medium.com/@kumarpramod017/what-do-mean-escaping-and-nonescaping-closures-in-swift-d404d721f39d.

再补充一点,每个 ios 开发者都需要理解:

  1. 逃离封闭:转义闭包是在传递给它的函数返回后调用的闭包。换句话说, 它比传递给它的函数寿命更长。
  2. 非逃逸闭包:在传入的函数内(即返回之前)调用的闭包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift @escaping 和完成处理程序 的相关文章

随机推荐

  • Dojo 拖放:如何检索项目的顺序?

    我创建了一个 Source 对象并进行配置 通过创建者 以便它呈现一组数据供我的用户根据需要进行排序 这一切工作正常 但是 我无法弄清楚如何在用户重新排序后检索数据 getAllNodes 返回 dom 节点 我需要原始数据对象 这真的很简
  • java - 文件lastModified与读取文件

    我正在使用一个文件 并且需要在修改文件时更新 java 中的值 所以 我想使用检查修改时间lastModified of File类 如果修改 则读取文件并更新文件中的单个属性 我的疑问是 是lastModified与从文件中读取单个属性
  • 从 C# .net 调用 python.py

    我在从 C 调用 python 脚本时遇到问题 我的 python 脚本根据参数 1 和参数 2 计算一个值并发送计算出的值 我无法获得计算值 比如说 我正在使用一个简单的 python 类并调用 C 以下是 python py impor
  • C库函数获取活动线程数

    我正在用 C 语言开发一个多线程 Unix 应用程序 有没有一种简单的方法来获取同时活动线程的数量 如果库已经可以为我完成的话 我不想编写代码来跟踪活动线程的数量 我正在使用 POSIX pthreads 并且我正在尝试为 Unix 和类
  • 重命名字典中的键

    我想重命名字典的键是整数 并且我需要它们是带有前导零的整数 以便它们正确排序 例如我的钥匙是这样的 1 101 11 我需要它们是 001 101 011 这就是我现在正在做的事情 但我知道有更好的方法 tmpDict for oldKey
  • 如何在 ES6 中使用所有默认值解构选项参数?

    我将 ES6 功能与 babel 编译器一起使用 我有一个将选项对象作为参数的函数 function myFunction option1 true option2 whatever console log option1 option2
  • 如何在使用支持库时构建带有 ListView 的 AppWidget?

    我想在早期版本的 Android 上的 AppWidget 中使用 ListView 拉格纳的回答在这个问题中 https stackoverflow com questions 8846743 app widget with listvi
  • 如何删除供应商代码插入的回调?

    我正在使用的 gem 插入了一个我想删除的 after save 回调 在我看来 从数组中删除符号比用猴子补丁解决问题更干净 如何访问回调数组 class UserSession lt Authlogic Session Base Don
  • symfony 2 中相同的 url 需要多个角色

    这是我的 security yml 的访问控制列表的样子 access control path admin roles IS AUTHENTICATED FULLY path admin roles ROLE ADMIN 我想要做的是 用
  • 为什么最多 4 个元素的集合是有序的,而更大的元素则不是?

    Given val xs1 Set 3 2 1 4 5 6 7 val ys1 Set 7 2 1 4 5 6 3 xs1 and ys1两者都导致scala collection immutable Set Int Set 5 1 6 2
  • 如何使用 Homebrew cask 安装 Sublime Text 3

    如何使用 Homebrew cask 安装 Sublime Text 3 当使用 Homebrew 的搜索时 我只看到 Sublime Text 2 我什至尝试点击自制软件 版本 https github com Homebrew home
  • 最容易实现的 Voronoi 图算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 实现 Voronoi 图的简单算法有哪些 我找不到任何专门以伪形式出现的算法 请分享一些 Vorono
  • 新值 EditText 未显示,没有任何错误

    编辑 顺便说一句 如果我在范围内硬编码 edt4 setText any text 它会显示该值 编辑2 尝试重建 清理项目 这可能是 settext 方法中的错误 看起来我做得对 当我用 settext 查看其他代码时 编辑3 start
  • 编译为 WebAssembly 时无法使 image::load_from_memory() 工作

    我正在尝试使用 Rust 将图像从 JavaScript 加载到 WebAssembly图像箱 https crates io crates image 我有以下 Rust 代码 extern crate image extern crat
  • 如何解决 Eclipse 中未解决的包含:

    我在 eclipse 中构建了一个简单的程序 include
  • SimpleDateFormat 在模拟器上工作正常,但在设备上错误

    我使用 SimpleDateFormat 从日期中提取相关信息 它在模拟器中运行得很好 但是在设备上测试时它无法正确格式化 Logcat 在模拟器中正确显示 但在手机上再次显示错误 private String getSectionHead
  • 在生产中使用 Postgres 配置 Rails

    我一直在谷歌上搜索有关如何将 Ruby on Rails 与 PostgreSQL 结合使用的教程 那里有一些非常好的信息 但几乎每个指南都集中在如何配置 Rails 以在开发和测试环境中使用 Postgres 他们会警告您不要将这些配置用
  • 当项目中有多个文件时,如何使用 Grunt 配置 LESS 的 sourceMap?

    我有多个 less 文件 我希望将它们处理为匹配的 css 每个文件的 sourceMaps 都与源位于同一文件夹中 这有多难 我用 less 直接执行此操作没有问题 但无法弄清楚如何在 grunt contrib less 中执行此操作
  • RESTful 设计:分页集合

    我正在设计一个 REST api 需要从服务器端强制执行分页 每个 x 翻阅任何资源集合的正确方法是什么 选项1 GET resource page
  • Swift @escaping 和完成处理程序

    我试图更准确地理解 Swift 的 闭包 But escaping and Completion Handler太难理解了 我查了很多Swift的帖子和官方文档 但感觉还是不够 这是官方文档的代码示例 var completionHandl