可选型闭包(Optional Closure)用作逃逸闭包时不用添加@escaping

当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,这样的闭包称为逃逸闭包

var oneClosure: (() -> Void)? = nil

func getEscapeClosure(closure: @escaping () -> Void?) {
    self.oneClosure = closure
}

getEscapeClosure {
    print("This is closure")
}

oneClosure?() //This is closure

但是当方法的参数是可选型的参数时添加@escaping会报错:

func getEscapeClosure(closure: @escaping (() -> Void)?) {
        self.closure = closure
}
//@escaping attribute only applies to function types

这是一个很早就被发现的问题SR-2444。可选型闭包(Optional Closure)的定义就是escaping属性。推荐正确的使用方式:

typealias NormalClosure = () -> Void
func getEscapeClosure(closure: NormalClosure?) {
        self.closure = closure
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容