我知道我应该使用@discardableResult
. 所以我有以下代码:
@discardableResult func someFunc() { ... }
然后我就叫它:
someFunc()
但是,如果我拥有并使用指向此方法的指针,那么它就不再起作用了。例如:
let someFunc = self.someFunc
someFunc() //unused warning
在这种情况下是否可以避免_=someFunc()
?
我知道我应该使用@discardableResult
. 所以我有以下代码:
@discardableResult func someFunc() { ... }
然后我就叫它:
someFunc()
但是,如果我拥有并使用指向此方法的指针,那么它就不再起作用了。例如:
let someFunc = self.someFunc
someFunc() //unused warning
在这种情况下是否可以避免_=someFunc()
?
不幸的是,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