Closure is already escaping in optional type argument

34 阅读1分钟

先来看一下这个错误提示,你有碰到过吗?图片这里将@escaping去掉就可以了,那么为什么呢?逃逸闭包是指闭包在函数返回后仍然被调用或存储的情况,Swift要求这样的闭包必须显式标记为@escaping,以便开发者意识到潜在的内存管理问题,比如循环引用。

Optional 的本质是枚举

public enum Optional<Wrapped> {    
    case none       // 表示 nil(无值)    
    case some(Wrapped) // 表示有值(存储 Wrapped 类型的值)
}

由于 Swift 的 枚举是值类型,所以 Optional 自然也是值类型

var aInt? = 42
var b = a // 这里会复制 a 的值(值类型行为)
a = nil   // 修改 a 不会影响 bprint(b)  
// 输出 Optional(42)

那么Closure is already escaping in optional type argument这个问题的关键点在于为什么swift隐式的将optional clousure设置为escaping找了各种文章都没有看到比较官方的解释这里我们自己做一个猜测: 1、由于参数设置为optional说明此参数对于方法来说不是必须的,所以其作用域超出当前方法的几率更大

2、可能编译器认为

  •  非可选闭包:通常用于同步操作

  • 可选闭包:通常用于异步操作或存储

如果你有更合理的猜测,也欢迎在评论区说出你的看法 本文同步自微信公众号

image.png