【问题标题】:Swift: What does "completionHandler: ((Bool) -> Void)" mean? [duplicate]斯威夫特:“completionHandler:((Bool)-> Void)”是什么意思? [复制]
【发布时间】:2018-08-03 15:29:12
【问题描述】:

谁能解释一下 completionHandler: ((Bool) -> Void) 是什么意思?

例如在请求摄像头访问时出现:

AVCaptureDevice.requestAccess(for: AVMediaType.depthData, completionHandler: (<#T##(Bool) -> Void#>))

我通常这样做是为了检查是否授予了访问权限:

func requestCamera() {
        AVCaptureDevice.requestAccess(for: AVMediaType.video) { (response) in
            if response {
                print("true")
            } else {
                print("denied")
            }
        }

    }

显然,我在那里做事,但这并不重要。我只是想了解 ((Bool) -> Void) 的含义以及为什么我必须在这里使用完成处理程序。使用其他函数,我可以将处理程序设置为 nil,但在这种情况下,它期望以某种方式得到响应。

那么这是什么意思呢?

【问题讨论】:

  • 注意:这是使用尾随闭包语法。调用之后的闭包作为调用的最后一个参数提供。 { (response) in} 之间的所有内容都是一个闭包,它接受 Bool 并且不返回任何内容。此闭包以completionHandler 的形式提供给requestAccess,当函数调用completionHandler(true) 或可能与false 一起调用时,您的闭包将执行。
  • 此完成处理程序不期望 来自您的响应,它会在您的应用用户决定授予 / 后通知您拒绝 (Bool) 捕获视频的权限 - 您显然希望获得有关此的反馈,因为您的应用下一步操作取决于用户的决定。

标签: ios swift void completionhandler


【解决方案1】:

阅读 Swift documentation 的闭包部分。

这是一个完成闭包,当AVCaptureDevice.requestAccess 完成请求用户访问时执行。它有一个Bool 参数,根据用户是否授予访问权限为真/假。它不是可选的,所以你必须提供一些关闭 - 这是AVCaptureDevice.requestAccess作者的决定,这是有道理的 - 如果你请求访问,你请求它是因为你想使用AVCaptureDevice。因此作者希望您以某种方式完成requestAccess

【讨论】:

  • 谢谢。我现在明白了。但是为什么我不能对 PHPhotoLibrary.requestAuthorization 使用与上面相同的结构?如果我使用“响应”,我会收到此错误: PHAuthorizationStatus' is not convertible to 'Bool' 。在这种情况下,我只使用 if status == .authorized {... 。这不是同一个结构吗?
  • @RjC 仅仅因为AVCaptureDevice 具有(Bool) -&gt; Void 类型的闭包,而PHPhotoLibrary 具有(PHAuthorizationStatus) -&gt; Void 类型的闭包.. 它们接受不同的类型,因此在一种情况下,参数是Bool 值,在另一个 PhAutorizationStatus 中(参见文档:developer.apple.com/documentation/photos/phphotolibrary/…
  • 非常感谢!这有助于了解这里发生了什么!
【解决方案2】:

闭包表达式语法有以下一般形式:

{ (parameters) -> return type in
    statements
}

闭包表达式语法中的参数可以是 in-out 参数,但不能有默认值。如果您命名可变参数,则可以使用可变参数。元组也可以用作参数类型和返回类型。

completionHandler: ((Bool) -> Void) 这意味着你会在你的闭包中得到一个布尔值并且它不会返回任何东西(Void)。就像一个方法。

您可以在Apple's documentation about closures中找到更多信息

【讨论】:

  • 闭包已经成为 iOS 开发的重要组成部分(我不能代表 macOS,但我也假设在那里)。大多数情况下,您看到/创建闭包是因为异步编程。您可以将其视为 ajax 调用的“完成”部分,或者类似于 try catch 的 finally 语句。
【解决方案3】:

(Bool) -&gt; Void 表示闭包接受 Bool 作为参数并返回 Void(即什么都没有)。

您提供了一个完成处理程序,因为requestAccess 异步执行。当用户决定授予您的应用什么权限后,iOS 将调用完成处理程序以继续执行您的程序。

【讨论】:

    【解决方案4】:

    大多数闭包用于处理一些稍后可用的信息,例如,需要几秒钟才能响应的后端请求,甚至在某些操作之前需要一些操作。

    当您调用具有完成处理程序的函数时,这与将来请求某些内容相同,它将在信息可用时执行,这是异步处理或需要等待某些操作时的绝佳解决方案,然后在获得必要的数据后继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多