Search code examples
swiftclosuresswift3

Using @discardableResult for Closures in Swift


Swift 3 has introduced the @discardableResult annotation for functions to disable the warnings for an unused function return value.

I'm looking for a way to silence this warning for closures.

Currently, my code looks like this:

func f(x: Int) -> Int -> Int {
  func g(_ y: Int) -> Int {
    doSomething(with: x, and: y)
    return x*y
  }
  return g
}

In various places I call f once to obtain a closure g which I then call repeatedly:

let g = f(5)
g(3)
g(7)
g(11)

In most places I'm only interested in the side effects of the nested call to doSomething, and not in the return value of the closure g. With Swift 3, there are now dozens of warnings in my project for the unused result. Is there a way to suppress the warnings besides changing the calls to g to _ = g(...) everywhere? I couldn't find a place where I could place the @discardableResult annotation.


Solution

  • I don't think there's a way to apply that attribute to a closure. You could capture your closure in another that discards the result:

    func discardingResult<T, U>(_ f: @escaping (T) -> U) -> (T) -> Void {
      return { x in _ = f(x) }
    }
    
    let g = f(5)
    g(3)  // warns
    let h = discardingResult(g)
    h(4)  // doesn't warn