有没有办法在不调用它的情况下使转义闭包无效?

Is there a way to nullify a escaping closure without calling it?

我正在寻找一种方法来使转义闭包无效而不调用它。

func should(completion: @escaping () -> Void) {
    if something {
        completion = nil
    } else {
        completion()
    }
}

据我了解,转义闭包可以在should函数完成后调用,它会一直存在直到被调用。

有没有办法在不调用它的情况下使闭包(和捕获的值)无效?

在你的例子中,闭包实际上没有转义,因为你没有将它分配给函数之外的任何东西,所以没有必要取消:

func should(completion: () -> Void) {
    if !something {
        completion()
    }
}

但如果它正在转义,比如将其分配给 属性,那么您可以取消 属性 以释放它:

class Foo {
   let fn: (() -> Void)?

   func should(completion: @escaping () -> Void) {
      fn = completion
   }

   func executeAndRelease() {
      fn?()
      fn = nil
   }
}