Swift 2和Swift 3中的核心数据妈妈扩展

时间:2016-10-11 15:36:37

标签: swift core-data

我最近将应用程序的语法从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"

1 个答案:

答案 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)"