【问题标题】:Handle swift throw in closure in objective-c在objective-c中处理快速关闭
【发布时间】:2017-03-30 06:26:46
【问题描述】:

我有一个如下所示的 Objective-c 函数

+ (void) invokeSortingWithClassName: (NSString*) className functionName: (NSString*) functionName closure: (id(^)(NSArray* arr))closure;

我必须从 swift 类中调用此方法。调用此方法的 swift 代码如下所示

SortHandler.invokeSorting(withClassName: className, functionName: functionName, closure:
{
    args in 
    let something = unwrap(args!)
    do
    {
        let returnValue = try closure(something as NSArray!) //this is another closure coming as a parameter in the function in which this code is written and this throws
        return returnValue;
    }
    catch
    {
        throw error

    }
    return "-1" as! T
})

在闭包定义的开始,我得到这个附加错误

本质上,这个闭包会抛出一个错误,我不确定如何在这个函数的objective-c定义中处理这个错误。请帮我解决这个错误

【问题讨论】:

  • 你的闭包不会抛出错误。您将需要简单地返回nil 来指示失败甚至导致运行时异常,具体取决于问题的严重程度。投掷后的回报也是没有意义的。
  • 为什么闭包不能抛出错误?是否有任何 Apple 文档支持它或链接到任何其他博客/SO 帖子?
  • 闭包可以抛出,但这个闭包不能;它没有被声明为抛出(这是错误消息告诉你的)并且它不能被声明为抛出,因为它是在一个 Objective-C 类中声明的,而 Objective-C 对 Swift 异常一无所知。
  • 这正是我的问题——我如何在objective-c中声明相同的内容?有办法吗?
  • 有一种方法可以处理它:uraimo.com/2015/11/03/… - 但是,我无法解决它的闭包问题。

标签: ios objective-c swift


【解决方案1】:

虽然可以使用 throws 声明闭包,但尚未使用 throws 声明此闭包,因此您的闭包无法抛出 - 这正是错误消息告诉您的内容。

由于函数是在 Objective-C 中声明的,因此无法将函数签名更改为包含 throws,因为 Objective-C 对 Swift 异常一无所知。

在 Swift 和 Objective-C 之间转换错误处理的标准方式是让 Objective-C 块接收 &NSError 参数。

如果你有能力改变Objective-C的方法签名,它应该被声明为

+(void) invokeSortingWithClassName: (NSString* _Nullable) className functionName: (NSString* _Nullable) functionName closure: (id _Nullable (^_Nullable)(NSArray* _Nullable arr, NSError* _Nullable * _Nullable error))closure;

这将允许您通过 Objctive-C 中的 error 参数接收到错误,从而从 swift 中快速 throw

如果您无法更改方法签名,那么您需要在闭包中捕获异常并简单地返回一个“错误”值,例如nil

【讨论】:

  • 这里使用 nullable 有什么重要性吗?因为,我尝试了相同的解决方案,但没有可以为空,但它不起作用。
  • nullable 让 Swift 知道哪些参数是可选的。即使是纯 Objective-C 也最好包含它
  • 我尝试了同样的事情,但它不起作用 - 我仍然遇到同样的编译错误。
猜你喜欢
  • 2019-06-29
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多