Invalid conversion from throwing function of type (_,_,_) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void

阅读时长 4 分钟读完

在前端开发中,我们常常需要进行网络请求来获取数据。在iOS中,我们可以使用NSURLSession发起网络请求,同时也需要处理一些异常情况。但是,有时候会出现“Invalid conversion from throwing function of type (,,_) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void”这个错误,那么这个错误是什么意思呢?又该如何解决呢?

错误原因

首先,我们需要了解一下Swift中的throw和try关键字。throw用于抛出异常,而try用于捕捉异常。在NSURLSession中,我们通常会使用dataTask(with:completionHandler:)方法来发起网络请求,其中completionHandler参数就是一个带有三个参数(_ data: Data?, _ response: URLResponse?, _ error: Error?) -> Void的闭包。由于网络请求可能会出现异常情况,所以error参数是一个optional类型的。

如果我们想要在闭包中使用throw关键字抛出异常,就需要将闭包声明为throws类型。例如:

然而,如果我们将带有throws的闭包传递给不支持throws的方法或者函数,就会出现“Invalid conversion from throwing function of type (,,_) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void”这个错误。

解决方法

解决这个问题的方法很简单,我们只需要将带有throws的闭包转换为不带throws的闭包即可。在Swift中,我们可以使用do-catch语句来捕捉异常,并将异常转换为optional类型的error参数。

例如:

-- -------------------- ---- -------
---- ---------------------------- --------- -- ----- ------ - --------- ------------- - ------ ------- -- ----- -

    --- ------- - -----------------

    ----- --- --- - ----------- -------------------------- ---- -
        ---------------------- ---- --------------- --- ----- --- --------- -----
        ------
    -

    --- ---- - ---------------------- ---- - ------ --------- ------ --

        -- -
            --- ----------------------- --------- ------
        - ----- -
            ---------------------- ---- ------
        -
    -

    -------------
-

在上面的例子中,我们首先使用guard语句判断URL是否有效。如果无效,则直接调用completionHandler并返回一个NSError类型的对象。否则,我们将data、response和error作为参数传递给闭包。在闭包中,我们使用do-catch语句来捕捉异常。如果没有异常,则使用try关键字来调用completionHandler;否则,我们将异常转换为optional类型的error参数,并调用completionHandler。

指导意义

对于前端开发人员来说,理解这个错误的原因以及解决方法是非常重要的。在处理网络请求时,异常情况是非常常见的,因此我们需要掌握如何使用throw和try关键字来处理异常。同时,我们还需要了解闭包的类型及其参数列表,并将异常转换为optional类型的error参数。这样,我们才能更好地处理网络请求中的异常情况,提高应用程序的稳定性和可靠性。

以上就是“Invalid conversion from throwing function of type (,,_) throws -> Void to non-throwing function type (NSData?, NSURLResponse?, NSError?) -> Void”错误的解决方法及指导意义。希望可以帮助大家更好地理解Swift语言中的异常处理机制,并在实际开发中运用到相关知识。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/606f23f12d2a29a3c12036b5

纠错
反馈