我刚将我的项目迁移到Swift 3,并且因为我的懒惰实例化NSFetchResultController而陷入错误。我在这里使用这个方法:
我当前的代码
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个错误,如下所示
在Swift 3下,这种方法不再可行吗?我尝试按照Xcode的建议添加() -> <<error type>> in
但未能产生正确的结果。
答案 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")
使用fetch
,insert
等功能可以摆脱所有类型的强制转换。