从 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 框架吗?
NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3