【问题标题】:errors thrown from here are not handled because the enclosing catch is not exhaustive in context.save从这里抛出的错误不会被处理,因为封闭的 catch 在 context.save 中并不详尽
【发布时间】:2017-05-18 19:26:39
【问题描述】:

在将 xcode 更新到版本 8.3.2 之后,我遇到了问题并尝试。该代码正在运行,但在该更新之后不再起作用。它符合以下代码:

func saveContext() -> NSError?{// It saving
        do {
            if  context == context {
                try context.save()
           // taskNameTextField.text=nil
            }
        } catch let error as! NSError? {
            print("error saving core data: \(error)")
            return error
        }
        return nil
    } //

有人可以帮助我吗?

【问题讨论】:

  • 应该只是 catch let error as NSError 没有随机不必要的标点符号。
  • @dan 问题是错误不是 Swift 3 中的 NSError。它是一个错误。
  • @DanielT。您可以将Error 桥接到NSError

标签: ios swift core-data try-catch xcode8


【解决方案1】:

所以事实证明,当从 Swift 2 更新到 Swift 3 时,Apple 转换器并没有捕捉到代码中的所有问题。你需要自己更新一些东西。它没有捕获的一件事是对 NSError 的所有引用。它遗漏了几个需要将 NSError 转换为 Error 的地方。

func saveContext() -> Error?{ // remove the `NS` from Error here.
    do {
        if  context == context { // this is always true, remove it.
            try context.save()
        }
    } catch { // remove the `let error as! NSError?` from here
        print("error saving core data: \(error)")
        return error
    }
    return nil
}

这个函数的更简单的版本是:

func saveContext() -> Error? {
    do {
        try context.save()
        return nil
    } catch {
        return error
    }
}

或将catch 提高一级,它变为:

func saveContext() throws {
    try context.save()
}

【讨论】:

    【解决方案2】:

    使用 Do-Catch 处理错误 您可以使用 do-catch 语句通过运行代码块来处理错误。如果 do 子句中的代码抛出错误,则将其与 catch 子句进行匹配,以确定其中哪一个可以处理错误。

    下面是 do-catch 语句的一般形式:

    do {
        try expression
       // statements
    } catch pattern 1 {
       // statements
    } catch pattern 2 where condition {
       //statements
    } catch {
      // statements
    }
    

    你必须写最后一个默认的“catch”块,就像“Switch_case”的默认值一样:

    【讨论】:

      【解决方案3】:

      这是 swift 4.2 中的解决方案

       func saveContext() -> NSError? {
          do {
              try managedContext.save()
          } catch let error as NSError {
            print("error saving core data: \(error) \(error.description)")
            return error
          }
          return nil
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2015-08-29
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多