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

时间:2019-02-10 22:22:58

标签: swift compiler-errors completionhandler

我已按照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)
    }

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

3 个答案:

答案 0 :(得分: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)
    })

无论如何,我不确定这是否真的可以改善,您应该最好找到更好的教程。

答案 1 :(得分:0)

我觉得还可以,您可以随时尝试

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

答案 2 :(得分:0)

您的函数返回一个闭包。您尚未使用的是闭包。 这样做:

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

请注意最后加上括号。或者更清楚一点:

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