Swift:"completionHandler: ((Bool) -> Void)"是什么意思?

Swift: What does "completionHandler: ((Bool) -> Void)" mean?

谁能解释一下 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,但在这种情况下,它期望以某种方式得到响应。

那么这是什么意思?

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

{ (parameters) -> return type in
    statements
}

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

completionHandler: ((Bool) -> Void) 这意味着你会在你的闭包中得到一个布尔值并且它不会 return nothing(Void) .就像一个方法。

您可以在 Apple's documentation about closures

中找到更多相关信息

(Bool) -> Void 表示闭包接受一个 Bool 作为参数并且 return 一个 Void (即什么都没有)。

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

阅读 Swift documentation 的闭包部分。

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

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

当你调用一个有完成处理程序的函数时,它就像在将来请求一些东西,它将在信息可用时执行,这是异步东西或当你需要等待时的一个很好的解决方案一些操作,然后在您获得必要的数据后继续。