从 Swift 2.3 迁移到 Swift 3 错误消息

Posted

技术标签:

【中文标题】从 Swift 2.3 迁移到 Swift 3 错误消息【英文标题】:Migration from Swift 2.3 to Swift 3 error message 【发布时间】: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' 但没有做任何事情,出现了不同的错误。 【参考方案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'。

以上是关于从 Swift 2.3 迁移到 Swift 3 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

错误:Swift 2.3 不支持核心数据代码生成

NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3

升级到 Xcode 8 并将语法从 swift 2.3 转换为 swift 3.0 后文件丢失警告

从Swift 3.2迁移到Swift 4我使用autosavesInPlace收到错误