我遇到了一种情况,即可以在函数f1
中调用闭包(其中将闭包传递给),或者将闭包传递给其他函数f2
。
所以,现在我想知道该如何定义这种封闭的逃避行为。我是说我应该放不放@escaping
?
样本功能:
func f1(_ completionHandler: ()->()){
if someFlag == true{
completionHandler()
return
}
f2(completionHandler)
}
func f2(_ completionHandler: ()->()){
// some other magic
}
对不起,如果有一些语法错误,(在这里输入方法),我的问题是,函数completionHandler的f1
类型属性应该是什么?
发布于 2017-01-31 07:26:45
当您需要@escaping
时,规则很简单--如果闭包函数参数可以转义函数调用的生存期,则需要将其标记为@escaping
(编译器根本不允许编译它)。
在示例代码中,completionHandler
在f2
中没有标记为@escaping
,因此不能逃避f2
的生存期。因此,它也不可能逃脱f1
的生命周期,因此您不需要将f1
的completionHandler
标记为@escaping
。
然而,如果f2
的completionHandler
可以逃脱f2
的生存期,那么您就必须将f2
和f1
的参数标记为@escaping
,因为它可以避免两个调用的生存期。
https://stackoverflow.com/questions/41960447
复制相似问题