0

我知道我应该使用@discardableResult. 所以我有以下代码:

@discardableResult func someFunc() { ... }

然后我就叫它:

someFunc()

但是,如果我拥有并使用指向此方法的指针,那么它就不再起作用了。例如:

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

在这种情况下是否可以避免_=someFunc()

4

1 回答 1

1

不幸的是,discardableResult仅适用于方法/函数声明。您可以做的是将返回值的函数包装在返回 void 的闭包中:

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

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

或者,编写一个“擦除”函数返回类型的函数:

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

let someFunc = discardResult(f)

缺点是您需要为每个 arity 编写 this 的重载:

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
于 2021-02-25T06:37:06.453 回答