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