Swift中completionHandler: ((Bool) -> Void)是什么意思?为何必须使用?
关于
completionHandler: ((Bool) -> Void)的完全解析 一、先搞懂((Bool) -> Void)到底是什么
这其实是一个闭包类型的参数,咱们拆开来掰碎了理解:
(Bool):表示这个闭包会接收一个Bool类型的参数——放在相机权限的场景里,这个布尔值就是最终的权限结果:true代表用户同意授予权限,false代表用户拒绝了。-> Void:说明这个闭包没有返回值,你只需要在闭包里面写收到结果后的逻辑就行,不用给系统返回任何东西。
简单说,这个参数就是让你提前跟系统约定:“等用户处理完权限弹窗后,把结果传给我,我要执行这些后续操作”。比如你平时写的代码:
AVCaptureDevice.requestAccess(for: .video) { granted in if granted { // 打开相机开始拍摄 } else { // 提示用户去设置里开启权限 } }
这里的{ granted in ... }就是完全符合((Bool) -> Void)类型的闭包,系统会在用户做出选择后自动调用它,把结果塞给你。
二、为什么相机权限请求必须用完成处理程序,不能设为nil?
核心原因是权限请求是异步操作:
当你调用requestAccess时,系统会立刻“放手”让代码继续往下走(不会卡住你的主线程),然后弹出系统级的权限弹窗,等待用户手动点击允许/拒绝。这个过程是在后台等着用户操作的,函数本身没办法直接把结果返回给你——总不能让整个APP卡死等着用户点按钮吧?
所以必须通过完成处理程序这种“回调”的方式,在用户操作完成后,把结果异步通知给你。如果这个参数允许设为nil,那系统就没地方传递权限结果了,你完全不知道用户到底选了啥,后续的相机操作根本没法正常进行。
至于你说的其他函数可以设nil的情况,那些通常是可选回调:比如有些操作的结果不影响主流程,或者你可以通过其他方式(比如监听通知、主动查询状态)获取结果,所以允许你不传回调。但相机权限请求的结果是后续操作的必要前提,系统设计时就要求你必须接收这个结果,所以这个完成处理程序是必填的。
内容的提问来源于stack exchange,提问作者RjC
相关产品推荐
相关产品推荐

