lazy var NSFetchedResultsController在Swift 3.0中产生错误

All*_*ome 3 nsfetchedresultscontroller swift3

我刚刚将我的项目迁移到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
}()
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

在Swift 3下这种方法不再可行吗?我() -> <<error type>> in按照Xcode的建议尝试添加,但未能产生正确的结果.

vad*_*ian 10

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

在Swift 3中NSFetchedResultsController已成为通用类型.你必须初始化它:

lazy var fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = {
...
}()
Run Code Online (Sandbox Code Playgroud)

以及 NSFetchRequest

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")
Run Code Online (Sandbox Code Playgroud)

如果您正在使用NSManagedObject- 推荐的子类 - 您可以使用子类类型来更具体

lazy var fetchedResultsController: NSFetchedResultsController<MyEntity> = {
....
let fetchRequest = NSFetchRequest<MyEntity>(entityName: "MyEntity")
Run Code Online (Sandbox Code Playgroud)

巨大的好处就是你得到蒙上使用摆脱所有类型的fetch,insert等等.