Swift 2:从类型的抛出函数到非抛出函数的无效转换

Posted

技术标签:

【中文标题】Swift 2:从类型的抛出函数到非抛出函数的无效转换【英文标题】:Swift 2: Invalid conversion from throwing function of type to non-throwing function 【发布时间】:2015-06-14 06:27:54 【问题描述】:

我有一些(丑陋的)自己编写的代码移植到 Swift2 并在 lambda 函数中得到了这个错误消息:

我不明白的是,我使用错误抛出函数 JSONObjectWithData 处理整个代码并捕获错误。我没有在代码中抛出任何东西。尽管如此,编译器意味着我抛出了一个错误。

我需要了解这种行为。请善待,因为我知道我必须改进我的代码才能充分利用 swift2 中新的错误处理概念。

非常感谢您。

【问题讨论】:

【参考方案1】:

这很快。在这篇文章的帮助下,我已经找到了解决问题的方法:

http://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

您必须在代码末尾放置一个通用的 catch 子句,因为仅 NSError 的 catch 是不够的。

catch let error as NSError

   failure(error: error)
   return


// this is important -->
catch


【讨论】:

当我们在 Swift 1/1.2 中甚至没有 trycatch 时,为什么你认为 Apple 让 Swift 2 中的 catch 详尽无遗? 您不必专门捕获错误。通用 catch 块中应该有可用的错误引用。 嗨,乔恩,你能给我举个例子,我如何在通用 catch 块中使用错误引用?谢谢 这实际上对我没有帮助。我仍然收到错误“从 '() throws -> ()' 类型的抛出函数到非抛出函数类型 '() -> Void' 的无效转换”。 我们为什么需要这样做是有充分理由的:如果抛出的错误 is 不是 TheErrorsYouExpected 之外的东西,您仍然可以捕获它。有关更多信息,请参阅this 答案的 cmets。假设你的错误应该是 BadNetworkError 类型,但突然之间你得到了一个 lowMemoryError。香草捕捞会救你!【参考方案2】:

我认为最好的方法是将你的失败函数签名更改为ErrorType。那么就

catch let error 
    failure(error: error)

会的。

【讨论】:

使用 Apple API 时,最好将错误转换为 NSError,因为 Apple 方法倾向于抛出 NSError 对象。 Apple 的 NSError 对象包含有关已发生错误的其他详细信息,这些详细信息可在 NSError 特定属性中访问,例如 .localizedDescription 和 .userInfo。原始发帖人评论中的“JSONObjectWithData”会抛出一个 NSError 对象。 CoreData 方法也会抛出 NSError 对象。我更喜欢将错误从 INSIDE 的 catch 块中转换为 NSError ,以便捕获是详尽的。

以上是关于Swift 2:从类型的抛出函数到非抛出函数的无效转换的主要内容,如果未能解决你的问题,请参考以下文章

从 '(_) throws -> ()' 类型的抛出函数到非抛出函数类型 '(DataSnapshot) -> Void' 的无效转换

从 '(_) throws -> Void' 类型的抛出函数到非抛出函数类型 '([UNNotificationRequest]) -> Void 的无效转换

从 '(_, _, _) throws -> ()' 类型的抛出函数到非抛出函数类型 '(URLResponse?, Data?, Error?) -> Void 的无效转换

Alamofire 4从“(_) throws ->()”类型的抛出函数到非抛出函数类型“(DataResponse <Any>)-> Void”的无效转换

如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”

从类型 (_,_,_) throws -> Void 到非抛出函数类型 (NSData?, NSURLResponse?, NSError?) -> Void 的无效转换