先来看一下这个错误提示,你有碰到过吗?这里将@escaping去掉就可以了,那么为什么呢?逃逸闭包是指闭包在函数返回后仍然被调用或存储的情况,Swift要求这样的闭包必须显式标记为@escaping,以便开发者意识到潜在的内存管理问题,比如循环引用。
Optional
的本质是枚举
public enum Optional<Wrapped> {
case none // 表示 nil(无值)
case some(Wrapped) // 表示有值(存储 Wrapped 类型的值)
}
由于 Swift 的 枚举是值类型,所以 Optional
自然也是值类型
var a: Int? = 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、可能编译器认为
-
非可选闭包:通常用于同步操作
-
可选闭包:通常用于异步操作或存储
如果你有更合理的猜测,也欢迎在评论区说出你的看法 本文同步自微信公众号