lazy var NSFetchedResultsController 在 Swift 3.0 中产生错误

lazy var NSFetchedResultsController producing error in Swift 3.0

我刚刚将我的项目迁移到 Swift 3,但由于我的惰性实例化 NSFetchResultController 出现错误而卡住了。我在这里使用这个方法:

https://www.andrewcbancroft.com/2015/03/05/displaying-data-with-nsfetchedresultscontroller-and-swift/

我当前的代码

lazy var fetchedResultsController: NSFetchedResultsController = {

    let primarySortDescriptor = NSSortDescriptor(key: "company", ascending: true)
    let sortDescriptors = [primarySortDescriptor]

    self.fetchRequest.sortDescriptors = sortDescriptors

    let frc = NSFetchedResultsController(
        fetchRequest: self.fetchRequest,
        managedObjectContext: self.managedObjectContext!,
        sectionNameKeyPath: nil,
        cacheName: nil)

    frc.delegate = self

    return frc
}()

它产生如下所示的 2 个错误

这个方法在Swift3下是不是不能用了?我尝试按照 Xcode 的建议添加 () -> <<error type>> in,但未能产生正确的结果。

建议的 () -> <<error type>> 具有误导性。

在Swift3中NSFetchedResultsController变成了泛型。 您必须对其进行初始化:

lazy var fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = {
...
}()

以及NSFetchRequest

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")

如果你使用的是 NSManagedObject 的子类——推荐——你可以使用子类类型来更具体

lazy var fetchedResultsController: NSFetchedResultsController<MyEntity> = {
....
let fetchRequest = NSFetchRequest<MyEntity>(entityName: "MyEntity")

最大的好处是您可以使用 fetchinsert 等摆脱所有类型转换