#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)"