将 Core Data 相关代码迁移到 Swift 2

Migrating Core Data related code to Swift 2

我有一些这样的功能:

func getAllEntities() -> [MyEntity]? {

    let fetchRequest = NSFetchRequest(entityName:"MyEntity")

    var error: NSError?
    let fetchedResults = context.executeFetchRequest(fetchRequest) as! [MyEntity]?

    if let results = fetchedResults {
        return results
    }
    else {
            print("Could not fetch \(error), \(error!.userInfo)")
        }
    }

    return nil
}

现在升级到 Swift 2Xcode 7,我收到如下错误:

Cannot downcast from '[AnyObject]' to a more optional type '[MyEntity]?'

Call can throw, but it is not marked with 'try' and the error is not handled

这是在执行了自动 Swift 代码迁移之后,您在首次启动 Xcode 7 时会被要求执行此操作。在新 Swift 版本中重写我的函数的正确方法是什么?

谢谢

编辑: 我需要保持与 iOS 7iOS 8.

的向后兼容性

对于第一个错误,我通常会从 Xcode 那里得到建议,通常是要求我去掉 ?或将其更改为!,我无法为您提供具体的解决方案。

这是解决第二个错误的代码:

func getAllEntities() -> [MyEntity]? {

let fetchRequest = NSFetchRequest(entityName:"MyEntity")

var error: NSError?
let fetchedResults = try context.executeFetchRequest(fetchRequest) as! [MyEntity]?

do {
return results
}

catch error {
print("Could not fetch \(error), \(error!.userInfo)")
}

return nil
}

有两个错误:

  • 在Swift2中,executeFetchRequest()return是一个非可选的。所以您不能将 return 值转换为 [MyEntity]?。您可以(强制或可选)将其转换为 [MyEntity].
  • executeFetchRequest() 在错误情况下会抛出错误,所以它必须 在 do-catch 语句中用 try 调用。

示例:

func getAllEntities() -> [MyEntity]? {

    let fetchRequest = NSFetchRequest(entityName: "MyEntity")
    do {
        let results = try context.executeFetchRequest(fetchRequest) as! [MyEntity]
        return results
    } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
        return nil
    }
}

强制转换 as! [MyEntity] 在这里是可以接受的(就像你的 原始代码)因为你知道实体的class,它是 在核心数据模型检查器中设置。