【问题标题】:Migration from Swift 2.3 to Swift 3 error message从 Swift 2.3 迁移到 Swift 3 错误消息
【发布时间】:2016-11-03 11:15:47
【问题描述】:

我一直在尝试将 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。

提前致谢。 雷姆兹。

【问题讨论】:

  • NSFetchedResultsController in Swift 3 现在需要一个泛型类型声明。您能否在使用_uploadedSurveysController 的地方包含更多代码? (初始化为不是nil
  • 只需尝试删除 '= nil',因为您的变量已经是可选的并且可以是 nil 或其他任何东西,因此无论何时要使用,在使用此控制器之前都会检查 nil。
  • 嗨,Anni,我取出了 '= nil' 但没有做任何事情,出现了不同的错误。

标签: swift migration swift3 swift2.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
}()

我在a blog entry by Mike Buss 中找到了关于 Swift 中延迟实例化的很好描述

【讨论】:

    【解决方案2】:

    这里有更多代码。

    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!
    

    }

    【讨论】:

    • 您应该编辑原始问题以添加此信息。
    【解决方案3】:

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

    【讨论】:

    • 嗨,鲍勃,我已经尝试过了,但似乎仍然是同样的错误。 Xcode 出现添加另一个问号来修复它。
    • 顺便说一句,我刚刚删除了lazy,但留下了'= nil'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多