You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:32:27