Swift中如何调用以闭包作为参数的方法?
如何正确调用带嵌套闭包的Swift方法?
首先得搞懂你定义的theMethod里那个闭包参数的类型:((Error?) -> Void) -> Void,翻译成人话就是——这个参数是一个闭包A,而闭包A需要接收另一个闭包B(闭包B的类型是(Error?) -> Void,也就是拿可选Error当参数、没返回值的闭包),然后闭包A自己也没有返回值。
你之前的调用写法问题出在:你直接把一个空的闭包B实例塞给了外层的闭包A,但实际上闭包A的逻辑应该是接收闭包B作为参数,然后在合适的时机调用它,而不是直接传入一个现成的闭包。
正确的调用方式有两种:
1. 完整参数名写法
let example = ThisIsExample() example.theMethod(inside: { completionHandler in // 这里的completionHandler就是传入的闭包B,类型是(Error?) -> Void print("print something") // 你可以在需要的时候调用它,比如模拟操作成功(传nil)或者失败(传Error实例) completionHandler(nil) // 如果要模拟错误:completionHandler(NSError(domain: "MyDomain", code: 1001, userInfo: [NSLocalizedDescriptionKey: "操作失败"])) })
2. 尾随闭包简化写法(更常用)
因为inside是方法的最后一个参数,所以可以省略参数名,直接写闭包:
let example = ThisIsExample() example.theMethod { completionHandler in print("print something") // 调用回调闭包 completionHandler(nil) }
补充:为什么要这么设计?
这种嵌套闭包的写法通常用来处理异步操作,比如你的theMethod内部可能会做一些耗时任务(比如网络请求、文件读写),完成后会调用你传入的闭包A,并给它传一个用于通知结果的闭包B。举个模拟实现的例子:
class ThisIsExample{ func theMethod(inside:((Error?)->Void)->Void){ // 模拟异步操作,延迟1秒执行 DispatchQueue.global().asyncAfter(deadline: .now() + 1) { // 异步操作完成后,调用传入的inside闭包 inside { error in // 这里是回调闭包的逻辑,你在调用theMethod时可以自定义这个逻辑 if let error = error { print("收到错误:\(error)") } else { print("操作完成") } } } } }
这样当你调用theMethod时,闭包A里的代码会在异步任务完成后执行,你可以通过调用completionHandler(也就是闭包B)来传递操作的结果。
内容的提问来源于stack exchange,提问作者uzoo
相关产品推荐
相关产品推荐

