Swift中传递非逃逸闭包给期望逃逸闭包的函数报错解决
解决Swift中"Passing non escaping parameter to function expecting an @escaping closure"报错
咱们先搞清楚为啥会触发这个报错:
- Swift 里函数的闭包参数默认是**非逃逸(non-escaping)**的,意思是这个闭包会在函数执行过程中同步完成,不会被保存到函数外部延后执行。
- 而
UIViewController.dismiss(animated:completion:)的completion参数是被标记为@escaping的——这个闭包会被UIKit暂存起来,等到 dismissal 动画彻底结束后才会执行,属于典型的“逃逸”闭包。
你在HomeViewController里直接把completion传给了dismiss的对应参数,但你的Action类型定义并没有允许这个闭包参数逃逸,所以编译器就抛出了不匹配的错误。
具体解决步骤
只需要修改DetailViewControllerDelegateHandler里的Action类型别名,给闭包参数加上@escaping标记即可:
final class DetailViewControllerDelegateHandler: DetailViewControllerDelegate { typealias DismissComplete = () -> Void // 给DismissComplete参数添加@escaping标记,允许闭包逃逸 typealias Action = (@escaping DismissComplete) -> Void var dismissScene: Action? // 顺便修正拼写错误:dissmissScene → dismissScene private let model = Model() func detailViewController(_ controller: DetailViewController, doneButtonPressed button: UIBarButtonItem) { dismissScene? { [unowned self] in let value = controller.value self.model.update(with: value) } } }
这样修改后,编译器就明确知道Action接受的闭包参数是可以被逃逸的,自然就能顺利传给dismiss的completion参数了。
内容的提问来源于stack exchange,提问作者bobby123uk
相关产品推荐
相关产品推荐

