Swift 中闭包有什么特殊用途吗?有什么好处?

2023-12-02

我学习 Swift 一段时间了,也阅读了 Swift 语言指南。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

闭包的概念对我来说是新的。我想我可以理解如何使用它,但是我可以在哪里使用它呢?它有什么好处呢?

我用谷歌搜索并得到答案Swift 中何时使用闭包?

我认为答案并不令人满意。语言指南写了这么多,我猜这是该语言的一个非常重要的特性,也许它在框架中被广泛使用。

谁能给我展示更多例子来展示它的力量? 多谢。


这个问题可能有点宽泛,但我会尝试回顾一下。

参考文档:

闭包是可以传递的独立功能块 周围并在您的代码中使用。

当您想要将一段代码作为参数传递给想要异步执行的方法时,您应该使用闭包。

为了使它更简单 - 通过给出一个现实世界的例子 - 想象有一个方法负责扫描用户的照片,因此该方法应该返回一个照片数组和另一个视频数组:

伪代码:

// the method should scan the the user's photos and return them after fetching is finished

// the 'completion' (success) closure should returns two arrays
// what if there is something wrong happened? another closure should returns an error

// for the example purposes they are arrays of strings, the error is also a string
func scanPhotos( completion: @escaping (_ photos: [String], _ videos: [String]) -> (), failure: @escaping (String) -> ()) {
    // imagine that the scanning has been successfully done and you filled the two arrays:

    //if scanningSuccess {
        let fetchedPhotos = [String]()
        let fetchedVideos = [String]()

        completion(fetchedPhotos, fetchedVideos)
    //} else {
        // if something goes wrong
        failure("the error!!")
    //}
}

调用方法:

scanPhotos(completion: { (photos, videos) in
    // now you can use the fetched photos and videos
}, failure: { error in
    // display an alert -for example- based on the error is saying...
})

请注意,扫描过程应异步执行,完成后,应执行两个块(成功或失败)之一。


一些与闭包配合使用的流行方法:

  • animateWithDuration:动画:完成:
  • urlSession(_:dataTask:didReceive:completionHandler:)
  • 排序方式:)

AGAIN:这只是闭包的简单用法;您需要查看文档以了解更多详细信息。

我希望它有帮助。

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

Swift 中闭包有什么特殊用途吗?有什么好处? 的相关文章

随机推荐

  • 数字后跟大写 L

    什么是512L意思是 或者可能是任何数字后跟大写 L example uint sec然后是一些带有表达式的代码 sec 512L 取出来的XV6代码 mkfs c L代表long 这创建了一个类型的文字long l也可以 但看起来像1 所
  • 连接表上的 where 子句

    对于下表 ROOM ID NAME 1 ROOM 1 2 ROOM 2 房间状态 ID ROOM ID OPEN DATE 1 1 1 2000 01 01 00 00 00 2 2 1 2000 01 01 00 00 00
  • 向现有列添加自动增量,而不影响当前记录值

    我想将列类型更改为AUTO INCREMENT在现有的MyISAM1数据库表 数据库目前有数千条记录 其中列值非常重要 当前值不受影响至关重要 我想从最新的最高值开始递增 我在 phpmyadmin 中尝试了此操作 由 phpmyadmin
  • 编译 SCSS 时出现误报“未定义变量”错误

    使用 ruby compass gem 编译 SCSS 时收到错误消息 run var lib gems 1 8 gems compass 0 12 2 bin compass compile out unchanged sass part
  • 从 python dataframe 列中删除非 json 对象行

    我有一个数据框 该列包含 json 对象和字符串 我想删除不包含 json 对象的行 下面是我的数据框的样子 import pandas as pd df pd DataFrame A hello world a 5 b 6 c 8 usa
  • 仅支持横向界面方向

    我有使用横向右方向的应用程序 在视图控制器中我使用 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation Return
  • 系统 python 版本处于活动状态,而不是本地 pyenv 版本

    激活虚拟环境后如何检查使用的python版本是否正确 我尝试了which python3和which python 但两个输出都指示系统python版本而不是本地pyenv版本 它仍在使用我的本地版本还是我的安装有问题 这是命令行输出 Do
  • 如何根据 ViewModel 属性值添加淡入/淡出动画?

    我有一个视图模型它公开了字符串属性页面工具栏可见这可以是true or false private string pageToolBarVisible public string PageToolBarVisible get return
  • 有什么方法可以修改 JavaScript 中的“this”吗?

    我找到了这个答案 如何在javascript中修改 this 但我不喜欢它 肯定有办法somehow modify this 这是一个例子 function var a function v v 10 a function console
  • 标题栏颜色变化问题

    我想动态更改标题栏的颜色 即 有人单击按钮 它会更改颜色 但是 我似乎无法让它填满整个标题栏 这种情况在模拟器和 Nexus One 上都会发生 有任何想法吗
  • 在 Spark 中提取 hive 表分区 - java

    Spark 有没有办法只提取分区列名称 我使用的解决方法是运行 show extended table like table name using HiveContext 你可以使用类HiveMetaStore客户端直接查询HiveMeta
  • Pandas:对 NaN 值进行“或”运算

    我有一个包含 3 列的 DataFrame 每列的值为NaN 我想根据这 3 列填充第四列 这样or操作应用于列 如果第一个不是NaN 取其值 否则检查第二个 依此类推 自从一个NaN值不是一个False the or运算符不能按原样使用
  • 如何检测区域上方和下方的点?

    我有这个图像 其中红点是划分该阿拉伯语词段的不同字母的坐标 我想检测点之间区域上方或下方的点 点是 从左到右 81 183 80 217 83 275 83 314 现在字母上方有一个点 81 183 and 80 217 同样 上面的部分
  • 输入要读取的自定义文件名?

    我想允许用户键入要读取 写入的任何 txt 文件的名称 这是我的代码 printf Enter txt file name n scanf s fname FILE inputf inputf fopen fname w 问题是此方法不起作
  • 如何使用线程实现缓动函数

    我试图找到一种有效 正常或简单的方法来在我的 java 程序中实现缓动函数 我让缓动功能可以工作 但我觉得有一种更有效的方法来做到这一点 我看不到的 可能是因为视野狭隘 这是我的代码 有人可以告诉我应该采取哪些不同的做法 或者指出我需要研究
  • 作为系统运行的 Windows 服务无法访问 C:\users\

    我已将 Windows 服务安装为本地系统帐户 有时它会在计算机上构建目录列表 它在 Windows 7 的 c users 目录下失败 我检查了这些文件夹 它们似乎处于系统帐户的完全控制之下 为什么我无法访问这些目录 System Una
  • 在Python中查询连接的USB设备信息的简单方法?

    如何在Python中查询已连接的USB设备信息 我想获取 UID 设备名称 例如 SonyEricsson W660 设备路径 例如 dev ttyACM0 另外 无论何时再次连接设备 上述信息中用于识别设备的最佳参数是什么 UID 我正在
  • 如何增加 Node.js 中的最大调用堆栈大小

    这与有关 Node 中错误消息的其他问题不同 RangeError 超出最大调用堆栈大小因为我确切地知道为什么会收到此错误消息 发生这种情况是因为我正在递归 实际上递归了很多次 Thanks From node help node max
  • 即使滚动到元素后,Selenium MoveTargetOutOfBoundsException

    new Actions data moveToElement element x y perform 此代码适用于 Selenium 3 8 1 Chrome 63 chromedriver 2 3 8 最终升级到 Selenium 3 1
  • Swift 中闭包有什么特殊用途吗?有什么好处?

    我学习 Swift 一段时间了 也阅读了 Swift 语言指南 https developer apple com library content documentation Swift Conceptual Swift Programmi