Vyachaslav Gerchicov
Vyachaslav Gerchicov

Reputation: 2457

Ignore "unused" warning in Swift when use a "pointer" to func?

I know that I should use @discardableResult. So I have the following code:

@discardableResult func someFunc() { ... }

Then I just call it:

someFunc()

But if I have and use a pointer to this method then it doesn't work again. For example:

let someFunc = self.someFunc
someFunc() //unused warning

Is it possible to avoid _=someFunc() in this case?

Upvotes: 0

Views: 246

Answers (1)

Sweeper
Sweeper

Reputation: 270980

Unfortunately, discardableResult only applies to method/function declarations. What you can do is to wrap the value-returning function in a void-returning closure:

@discardableResult
func f() -> Int { return 1 }

// the type annotation here is important
let someFunc: () -> Void = { f() }

Alternatively, write a function that "erases" the return type of functions:

func discardResult<R>(_ f: @escaping () -> R) -> (() -> Void) {
    { _ = f() }
}

let someFunc = discardResult(f)

The downside is that you need to write an overload of this for each arity:

func discardResult<T, R>(_ f: @escaping (T) -> R) -> ((T) -> Void) {
    { x in _ = f(x) }
}

func discardResult<T, U, R>(_ f: @escaping (T, U) -> R) -> ((T, U) -> Void) {
    { x, y in _ = f(x, y) }
}

func discardResult<T, U, V, R>(_ f: @escaping (T, U, V) -> R) -> ((T, U, V) -> Void) {
    { x, y, z in _ = f(x, y, z) }
}

// and so on

Upvotes: 1

Related Questions