【问题标题】:How does Error work in Swift in Xcode 8 beta 4Xcode 8 beta 4 中的错误在 Swift 中如何工作
【发布时间】:2016-08-01 21:01:27
【问题描述】:

似乎在将我们的旧代码转换为 beta 4 时,我一直将 Error 转换为 NSError。这有时甚至会导致警告“从 'Error' 到 'NSError' 的条件转换总是成功”。我觉得我不明白如何最好地使用错误。我想思考一下 error.code、error.localizedDescription... 是否有很好的文档或教程来解释这些错误更改?

例如:

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 

现在我正在做类似的事情:

if let error = error as? NSError {
 if error.code == NSURLErrorCancelled {

但这会给出警告“从 'Error' 到 'NSError' 的条件转换总是成功”

【问题讨论】:

  • Error 可以桥接到 NSError,就像 String 可以桥接到 NSString 一样。即(错误为 NSError)会起作用。
  • 如果答案对您有所帮助,您介意将其标记为正确吗?
  • 我不认为这些答案是正确的,我认为这是一个 beta 4 问题。

标签: swift3 xcode8-beta4


【解决方案1】:

Error 可以桥接到 NSError,就像 String 可以桥接到 NSString 一样。即(错误为 NSError)会起作用。

if  (error as NSError).code == NSURLErrorCancelled { 
    // code
}

【讨论】:

  • 仅供参考:只是想投我自己的enum MyError : Error { case test }。结果:nsError.code 打印出0nsError.domain 打印出MyErrornsError.localizedDescription 打印出The operation couldn’t be completed. (MyError error 0.)
【解决方案2】:

这样做:

Swift 3.0 和 Swift 4.0

if error._code == NSURLErrorCancelled { }

【讨论】:

  • 我讨厌一种语言带有这样的“功能”
  • 我不会依赖无证的东西。它可能会在没有警告的情况下更改,您的应用会崩溃。
【解决方案3】:

Swift 3 中的错误捕获已更改。在Release Notes 中搜索 NSError。引用:

此外,从 Cocoa 和 Cocoa Touch 导入的错误类型维护了对应的NSError 中的所有信息,因此不再需要catch let as NSError 来提取(例如)用户信息字典。特定的错误类型还包含其通用用户信息键的类型访问器。例如:

do {
    let regex = try NSRegularExpression(pattern: "(", options: [])
} catch {
    // error is of type NSError already
    print(error.localizedDescription)
}

【讨论】:

  • 我将如何处理这个问题? func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 现在我正在做类似 if let error = error as? NSError { if error.code == NSURLErrorCancelled { 但这会给出警告“从 'Error' 到 'NSError' 的条件转换总是成功”
  • 我不确定这是否准确。 error.code 仍然无法访问,按住 alt 键单击 error 将显示它仍被推断为 Error 类型。
  • @Jason 您遇到的问题是使用error as? NSError 而不是error as NSError。错误总是可以转换为 NSError,因此您不需要使用条件转换(即as?),因为它总是会成功(这正是错误告诉您的内容)。
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多