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

Swift类中checkSignedIn函数是否需要移除@escaping标记的咨询

Swift @escaping 标记问题解答

结论先行

你的理解不正确,第一段代码不能移除@escaping标记。

核心概念解释

Swift中@escaping标记的作用是标注「逃逸闭包」,逃逸闭包的判定标准是:闭包的生命周期超出当前函数的执行周期,在函数返回之后才会被调用或者存储,不只是「存储到类成员变量」这一种情况。

对应你的代码场景分析

  1. 第一段代码里你调用的Amplify.Auth.fetchAuthSession是异步方法,它本身的入参回调就是逃逸闭包:你把传入的complete闭包放在这个异步回调里执行,意味着checkSignedIn函数会先执行完成返回,等到异步拉取登录状态的操作结束后,complete才会被调用,已经符合逃逸闭包的要求,必须加@escaping,否则编译器会直接报错。
  2. 你举例的第二段代码只是逃逸闭包的其中一种场景:把闭包存储到外部的属性中等待后续调用,这种情况确实需要加@escaping,但不是唯一需要标记的场景。

非逃逸闭包的适用场景

只有当闭包完全在函数执行周期内同步执行,闭包调用完成后函数才会返回时,才不需要加@escaping,示例如下:

func syncAdd(a: Int, b: Int, completion: (Int) -> Void) {
    let result = a + b
    completion(result)
    // 执行到此处completion已经调用完毕,函数才会返回,无逃逸
}

内容的提问来源于stack exchange,提问作者Thanh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:36:01