我最近将应用程序的语法从Swift 2
升级到Swift 3
,现在该应用程序崩溃致命error
:
在解包可选值时意外地发现了nil。
Swift 2 是:
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle()
.URLForResource(self.modelName,
withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
对 Swift 3 的更新是:
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main
.url(forResource: self.modelName,
withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
}()
Swift 3有什么不喜欢“妈妈”的扩展?该应用程序在Swift 2中工作,用户能够在应用程序内构建数据库而无需任何预加载,因此正在创建和使用url文件modelName.momd。 modelName声明为:
let modelName = "GameCountPro"
答案 0 :(得分:0)
我对AppDelegate中的行有同样的问题
let modelURL = Bundle.main.url(forResource: "CoreDataPractise", withExtension: "momd")!
'forResource'
中的名称应与您的dataModel
"CoreDataPractise.xcdatamodeld".
因为Swift 3.1没有给出CoreData堆栈样板代码,所以我从另一个旧项目中复制了所有延迟变量代码,这个项目实际上有一个名为"CoreDataDemo.xcdatamodeld"
的数据模型。由于这种不匹配,应用程序崩溃了,虽然崩溃在'被迫打开'点是一个红色的,让你觉得它可能是由于强行解开。
此修复后立即解决momd!
崩溃问题。
在您的情况下,请检查' URLForResource(self.modelName,...'正好正在为您提供项目中的数据模型名称,而不是"optional(dataModel name)"