Расширение momd основных данных в Swift 2 и Swift 3

#swift #core-data

#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, что ему не нравится расширение «momd»? Приложение работало в Swift 2, и пользователь мог создавать базу данных из приложения без какой-либо предварительной загрузки, поэтому создавался и использовался URL-файл ModelName.momd. Имя модели объявляется как:

 let modelName = "GameCountPro"
  

Комментарии:

1. Вы уверены, что это та строка, на которой происходит сбой? Вы используете принудительное разворачивание в двух местах, и любое из них может быть причиной.

2. Алоха Том, строка, на которой отображается сбой, такова: пусть modelURL = Bundle.main . url (forResource: self.ModelName, с расширением: «momd»)!

3. Вы изменили имя файла .xcdatamodel? Это имя будет определять правильное имя для использования в URL-адресе модели.

4. Хорошая мысль, я проверил, фактически вернулся к старой версии, скопировал и вставил имя файла модели. К сожалению, это не решило проблему.

5. Привет, в конце концов, у вас есть решение проблемы?

Ответ №1:

У меня была такая же проблема со строкой в AppDelegate

 let modelURL = Bundle.main.url(forResource: "CoreDataPractise", withExtension: "momd")!
  

Имя в 'forResource' должно точно соответствовать вашей модели данных

 "CoreDataPractise.xcdatamodeld".
  

Поскольку Swift 3.1 не предоставляет код котельной плиты стека CoreData, я скопировал весь код отложенных переменных из другого старого проекта, который на самом деле имел имя datamodel "CoreDataDemo.xcdatamodeld" . Из-за этого несоответствия приложение зависало, хотя сбой в точке принудительного развертывания был отвлекающим маневром, заставляющим вас думать, что это может быть связано с принудительным развертыванием.

momd! Сбой был устранен сразу после этого исправления.

В вашем случае проверьте, что ‘URLForResource(self.ModelName,…’ точно указывает вам имя модели данных, которое у вас есть в проекте, а НЕ "optional(dataModel name)"