lazy var NSFetchedResultsController在Swift 3.0中产生错误

时间:2016-10-02 12:12:44

标签: swift3 nsfetchedresultscontroller

我刚将我的项目迁移到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个错误,如下所示

enter image description here

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

1 个答案:

答案 0 :(得分:10)

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

在Swift 3 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等功能可以摆脱所有类型的强制转换。