【问题标题】:Cannot convert value of type () to expected argument type bool (Swift)?无法将类型 () 的值转换为预期的参数类型 bool (Swift)?
【发布时间】:2017-04-07 14:13:32
【问题描述】:

我有以下代码:

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if managedObjectContext != nil {
        if managedObjectContext.hasChanges && !managedObjectContext.save(){
            abort()
        }
    }
}

我有两个错误:调用可以抛出,但没有用 try 标记并且错误没有被处理。另一个说不能将类型 () 的值转换为预期的参数类型“布尔”。

我该如何解决这个问题?

【问题讨论】:

  • 你的部署目标是什么?
  • 请注意,关于[swift] call can throw, but not marked with try的问答有很多个...

标签: ios swift xcode


【解决方案1】:

NSManagedObjectContext save() 的文档具有误导性。它实际上在 Swift 中没有返回值。相反,它可能会引发错误。

您的两个错误是因为您忽略了throws 并将其视为返回Bool

您的代码需要类似于:

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if managedObjectContext != nil {
        if managedObjectContext.hasChanges {
            do {
                try managedObjectContext.save()
            } catch {
                print("Unable to save: \(error)")
                abort()
            }
        } else {
            abort()
        }
    }
}

【讨论】:

  • @MartinR 在 Swift 中,它记录了一个返回值,尽管它没有返回值。
  • 只有 Objective-C 视图。 Swift 视图记录为func save() throws
  • @MartinR 是的,签名在 Swift 文档中是正确的,但低于它记录了返回值,显示了真假结果的含义。
  • 啊——现在明白你的意思了!
【解决方案2】:
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext

    do {
        try managedContext.save()

    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }

【讨论】:

  • 一句话评论?
  • 这里不赞成纯代码的答案。请说明问题所在以及您的回答如何解决问题。
  • 问题是如何解决这个问题;)
  • 是的,但是一个很好的答案可以解释。这个想法是除了提供解决方案之外还进行教学。
猜你喜欢
  • 2016-10-12
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2017-02-07
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多