0

我一直在尝试将 Swift 项目迁移到最新的 Swift 版本。

fileprivate lazy var _uploadedSurveysController: NSFetchedResultsController? = nil

此代码行给出以下错误。

Nil cannot initialize the specified type NSFetchedResultsController?

Xcode 提出了一个修复建议,即在 NSFetchedResultsController 旁边添加另一个问号。当我说是时,它给出了相同的错误并提出了一个修复添加另一个问号。

这是更多代码

fileprivate var uploadedSurveysController: NSFetchedResultsController {
guard _uploadedSurveysController == nil else { return _uploadedSurveysController! }

 _uploadedSurveysController = NSFetchedResultsController(fetchRequest:     coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext:   managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

do {
  try _uploadedSurveysController!.performFetch()
} catch let error as NSError { Logger.sharedInstance.logMessage("\(#function)     Uploaded Surveys Fetching Error: \(error.userInfo)") }

 return _uploadedSurveysController!
}

任何帮助将非常感激。

只是让你知道。我对 Swift 非常陌生,并试图将现有项目从 Swift 2.3 更新到 3。

提前致谢。雷姆齐。

4

3 回答 3

1

在将 Swift 2 项目升级到 Swift 3 后,我遇到了同样的错误消息。在 Swift 中延迟实例化变得更加简单,因此不再需要隐藏的 _variableName 属性。

如果你添加了你的属性定义的惰性属性,那么你可以指定一个功能块来运行以在属性设置为 nil 时对其进行初始化。

fileprivate lazy var uploadedSurveysController: NSFetchedResultsController<NSFetchRequestResult> = {

    var fetchRequest<NSFetchRequestResult> = NSFetchedResultsController(fetchRequest: coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext:   managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

    do {
      try fetchedResultsController.performFetch()
    } catch let error as NSError { Logger.sharedInstance.logMessage("\(#function)     Uploaded Surveys Fetching Error: \(error.userInfo)") }

     return fetchedResultsContoller
}()

我在Mike Buss 的一篇博客文章中找到了关于 Swift 中惰性实例化的一个很好的描述

于 2016-11-22T15:46:04.297 回答
0

我认为这是因为lazy指定遵循与标准属性不同的规则。由于您已经自己实现了惰性实例化,因此该lazy关键字是不必要的(无论如何也不打算以这种方式使用)。尝试删除它,看看它是否有效。

于 2016-11-03T12:08:08.707 回答
0

这是更多代码。

fileprivate var uploadedSurveysController: NSFetchedResultsController {
guard _uploadedSurveysController == nil else { return _uploadedSurveysController! }

_uploadedSurveysController = NSFetchedResultsController(fetchRequest: coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

do {
  try _uploadedSurveysController!.performFetch()
} catch let error as NSError { Logger.sharedInstance.logMessage("\(#function) Uploaded Surveys Fetching Error: \(error.userInfo)") }

return _uploadedSurveysController!

}

于 2016-11-03T11:51:46.007 回答