Swift类中checkSignedIn函数是否需要移除@escaping标记的咨询
Swift @escaping 标记问题解答
结论先行
你的理解不正确,第一段代码不能移除@escaping标记。
核心概念解释
Swift中@escaping标记的作用是标注「逃逸闭包」,逃逸闭包的判定标准是:闭包的生命周期超出当前函数的执行周期,在函数返回之后才会被调用或者存储,不只是「存储到类成员变量」这一种情况。
对应你的代码场景分析
- 第一段代码里你调用的
Amplify.Auth.fetchAuthSession是异步方法,它本身的入参回调就是逃逸闭包:你把传入的complete闭包放在这个异步回调里执行,意味着checkSignedIn函数会先执行完成返回,等到异步拉取登录状态的操作结束后,complete才会被调用,已经符合逃逸闭包的要求,必须加@escaping,否则编译器会直接报错。 - 你举例的第二段代码只是逃逸闭包的其中一种场景:把闭包存储到外部的属性中等待后续调用,这种情况确实需要加
@escaping,但不是唯一需要标记的场景。
非逃逸闭包的适用场景
只有当闭包完全在函数执行周期内同步执行,闭包调用完成后函数才会返回时,才不需要加@escaping,示例如下:
func syncAdd(a: Int, b: Int, completion: (Int) -> Void) { let result = a + b completion(result) // 执行到此处completion已经调用完毕,函数才会返回,无逃逸 }
内容的提问来源于stack exchange,提问作者Thanh
相关产品推荐
相关产品推荐

