具有多个闭包参数的函数给出错误“表达式解析为未使用的函数”

Posted

技术标签:

【中文标题】具有多个闭包参数的函数给出错误“表达式解析为未使用的函数”【英文标题】:Function with multiple closure arguments gives error "Expression resolved to an unused function" 【发布时间】:2019-02-10 22:22:58 【问题描述】:

我已经关注a tutorial on Swift completion handlers 写了这个函数。每当我尝试使用闭包时,都会收到错误消息“表达式解析为未使用的函数”

func completion<Result>(onResult: @escaping (Result) -> Void, 
onError: @escaping (Error) -> Void) -> ((Result?, Error?) -> Void) 
return  (maybeResult, maybeError) in
    if let result = maybeResult 
        onResult(result)
     else if let error = maybeError 
        onError(error)
     else 
        onError(SplitError.NoResultFound)
    


如何称呼

    completion(onResult:  (j) in
        print(j)
    )  (e) in
        print(e)
    

错误:表达式解析为未使用的函数

【问题讨论】:

【参考方案1】:

通用函数 completion 返回一个闭包,该闭包旨在用作某些异步函数的完成处理程序。

例如,假设你有一些这样的异步方法:

func someAsyncFunc(completion: @escaping (Data?, Error?)->Void) 
    //...

因此,要使用闭包,您可能需要将返回的闭包存储到某个闭包变量中,以便以后使用:

    let myCompletionHandler = completion(onResult:  (j: Data) in
        print(j)
    )  (e) in
        print(e)
    

    someAsyncFunc(completion: myCompletionHandler)

或者,你可以直接写成参数:

    someAsyncFunc(completion: completion(onResult:  (j) in
        print(j)
    )  (e) in
        print(e)
    )

无论如何,我不能确定这是否真的是一个改进,你最好找到一个更好的教程。

【讨论】:

【参考方案2】:

我觉得还可以,你可以试试

completion(onResult:  (j) in print(j), 
           onError:  (e) in print(e) )

【讨论】:

【参考方案3】:

你的函数返回一个闭包。你没有做的是使用闭包。 这样做:

completion(onResult:  (j) in
    print(j)
)  (e) in
    print(e)
()

注意最后的括号。或者更清楚地说:

let completionClosure = completion(onResult:  (j) in
    print(j)
)  (e) in
    print(e)

completionClosure()

【讨论】:

以上是关于具有多个闭包参数的函数给出错误“表达式解析为未使用的函数”的主要内容,如果未能解决你的问题,请参考以下文章

表达式解析为未使用的 i 值 [重复]

转义闭包捕获 Swift 中的变异“self”参数错误

swift中具有多个闭包/ API请求的函数中的异步完成处理

函数与参数,闭包

如何处理完成闭包中的多个错误

具有多个同名参数的函数如何工作?