当前位置: 首页 > 面试题库 >

何时快速使用闭包?

谷梁向荣
2023-03-14
问题内容

我从事ios开发已经有几个月了,渴望在我的编程模式中实现新的东西。

现在,我正在学习闭包,并且对其语法了解甚少,知道可以将其用于代替回调。以及在某些UIViewAnimation中实现和排序。

但是我真的想知道它的用途。也就是说,在基本编程中应该在哪里使用闭包。就像我们要从孩子向父母发送信息时使用委托一样。因此,在日常的快速编程中可以使用的有关其实际的任何解释或简短示例都会有所帮助?

谁能告诉我这些闭包实际上是如何计算价值的

reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )

在这些示例中,有名称和闭包作为方法的参数。但是,这实际上是如何计算的?

您能否解释一下在此动画代码中传递闭包时它们如何工作:

UIView.animateWithDuration(duration: NSTimeInterval, 
    animations: (() -> Void)?, 
    completion: ((Bool) -> Void)?)

我真的想知道流程吗?


问题答案:

Swift中最常用的两种情况是完成块和高阶函数。

完成块: 例如,当您有一些耗时的任务时,您希望在该任务完成时收到通知。您可以为此使用闭包,而不要使用委托(或其他许多东西)

func longAction(completion: () -> ()) {
    for index in veryLargeArray {
        // do something with veryLargeArray, which is extremely time-consuming 
    }
    completion() // notify the caller that the longAction is finished 
}

//Or asynch version
func longAction(completion: () -> ()) {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

        for elem in veryLargeArray {
            // do something with veryLargeArray, which is extremely time-consuming
        }
        dispatch_async(dispatch_get_main_queue(), { 
            completion() // notify the caller that the longAction is finished 
        })
    }
}

longAction { print("work done") }

在上面的示例中,当您执行耗时的任务时,您想知道for循环何时完成通过非常大的数组的迭代。您将闭包{ println("work done")}作为该函数的输入参数,该函数将在for循环完成其工作之后执行,并打印“ workdone”。然后发生的事情是,您给longAction提供了一个函数(闭包)并将其命名为completion,并且在您调用completionlongAction
时将执行该函数。

高阶函数: 可以将闭包用作高阶函数的输入参数,例如:

let array = [1, 2, 3]
let smallerThanTwo = array.filter { $0 < 2 }

这样,您可以过滤出小于2的数字。

已更新 关于如何sorted(可能)的工作原理:

因此,想法是,排序后的数据将遍历数组,并将两个连续的元素(i,i + 1)相互比较,并在需要时交换它们。“如果需要”是什么意思?您提供的闭合值{ (s1: String, s2: String) -> Bool in return s1 > s2 }true如果s1在逻辑上大于则返回s2。如果返回true了该闭包,则sorted算法将交换这两个元素,并将其与接下来的两个元素(如果未到达数组的末尾,则为i
+ 1,i + 2)进行计数。因此,基本上,您必须提供一个闭包,sorted该闭包将告诉“何时”交换为元素。



 类似资料:
  • 问题内容: 我正在对服务器进行API调用。我正在利用Alamofire来解决这个问题。我正在尝试创建一个使用Alamofire的GET函数返回基于自定义类的对象的函数,该类包含此GET函数提供的各种输出。 我不清楚执行此操作的方式。 这是我的自定义类,其中包含有关响应的详细信息: 在另一个类中,我具有以下功能: 这将返回,因为在执行之前对服务器的调用未完成。我知道我应该能够使用闭包来做到这一点,但

  • 我正在关注一个在线课程(从2016年12月开始),并在此屏幕截图中收到错误。 这是我的代码: // // FirebaseManager.swift 多谢你的帮忙

  • 问题内容: 这是我的代码,但显示了进度。这段代码有什么错误吗?请提供一些想法来解决此问题,或者提供一些与此相关的链接。 问题答案: 更新的答案: 要关闭ProgressHUD:

  • 问题内容: 我试图在Swift中声明一个需要可选闭包的参数。我声明的函数如下所示: 但是Swift抱怨说,“条件”中的绑定值必须是一个可选类型,其中声明了“ if let”。 问题答案: 您应该将可选的闭包括在括号中。这将适当地限制操作员的范围。

  • Vanilla 的 Service vanilla 的 Service 预设为项目对某些通用业务逻辑封装为独立的 Service,方便维护、管理、缓存等。 Vanilla 的 Service 在项目的 models/service 路径下,一般使用 LoadModel 方法进行加载 最简单的 Service 由自动生成的 demo 中默认生成了 UserService,可以看出 UserServi

  • Vanilla 的 DAO vanilla 的 DAO 预设为项目对数据源的封装,一切对数据源的操作都可以封装成 DAO,方便维护、管理、缓存等。 Vanilla 的 DAO 在项目的 models/dao 路径下,一般使用 LoadModel 方法进行加载 最简单的 DAO 由自动生成的 demo 中默认生成了 TableDao,可以看出 TableDao 只是一个普通的 LUA 包。 loca