Решение «Не удалось вызвать назначенный инициализатор в classе NSManagedObject»

Я новичок в Swift, и я пытаюсь научиться использовать Core Data. Но я получаю эту ошибку, и я не уверен, что я сделал неправильно. Я искал в Интернете и пробовал несколько вещей, но я не могу понять это правильно.

Failed to call designated initializer on NSManagedObject class 'FirstCoreData.Course' 

Когда эта строка выполняется:

 ncvc.currentCourse = newCourse 

В этой функции:

 class TableViewController: UITableViewController, AddCourseViewControllerDelegate { var managedObjectContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "addCourse" { let ncvc = segue.destinationViewController as! NewCourseViewController ncvc.delegate = self let newCourse = NSEntityDescription.insertNewObjectForEntityForName("Course", inManagedObjectContext: self.managedObjectContext) as! Course ncvc.currentCourse = newCourse } } 

Класс, созданный с помощью «Создать подclass NSManagedObject …» для объекта курса:

 import Foundation import CoreData class Course: NSManagedObject { // Insert code here to add functionality to your managed object subclass } 

А также:

 import Foundation import CoreData extension Course { @NSManaged var title: String? @NSManaged var author: String? @NSManaged var releaseDate: NSDate? } 

Проблема заключается не в коде в вашем вопросе, а в fragmentе, который вы включили в качестве комментариев к другому ответу:

 var currentCourse = Course() 

Это не просто объявляет currentCourse типом Course , он также создает экземпляр объекта Course с использованием стандартного метода init . Это явно не разрешено: вы должны использовать назначенный инициализатор: init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) . Это описано в документации Apple.

Я подозреваю, что вы никогда не используете экземпляр, созданный указанным выше определением var, поэтому просто определите его как тип Course? :

 var currentCourse : Course? 

Поскольку это необязательно, вам не нужно устанавливать начальное значение, хотя вам нужно разворачивать значение всякий раз, когда оно используется.

Я была такая же проблема. И создание объекта таким, как это сработало, для вашего курса было бы примерно так:

 var currentCourse = Course.init(entity: NSEntityDescription.entityForName("Course", inManagedObjectContext:mox)!, insertIntoManagedObjectContext: mox) 

вместо:

 var currentCourse = Course() 

Самый простой способ:

  • Определить в applicationDelegate ссылку для контекста
  • Игнорировать переменную, передавая контекст

В AppDelegate (вне скобок):

 let appDelegate = UIApplication.shared.delegate as! AppDelegate let context = appDelegate.persistentContainer.viewContext 

И в коде:

 let currentCourse = Course(context:context) 

Теперь вы создали свою сущность. Но не забудьте сохранить:

 appDelegate.saveContext() 

Я использовал это в Xcode 8.3.2 с Swift 3.1.

 NSEntityDescription.insertNewObject(forEntityName: String(describing: type(of: Record())), into: managedObjectContext) as! Record 

И получил то же сообщение об ошибке. Но эти данные были вставлены в db. Так что, возможно, это не имеет значения.

Ваш текущий курс должен быть classом NSManagedObject

Пожалуйста, обратитесь к этой статье CoreData: error: Не удалось вызвать назначенный инициализатор в classе NSManagedObject

  • Операторы «++» и «-» устарели Xcode 7.3
  • Различия в синтаксисе NSDateComponents?
  • Swift 2.0: «enumerate» недоступен: вызовите метод «enumerate ()» в последовательности
  • Держите окно всегда сверху?
  • .toInt () удален в Swift 2?
  • Что такое синтаксис Swift 3 animateWithDuration?
  • Предупреждение об ошибке «C-style for Statement устарел» в Swift 3
  • Swift 2 - UnsafeMutablePointer для объекта
  • Что означает подчеркивание в этом случае?
  • Можно ли реплицировать автоматическое числовое преобразование Swifts в Foundation (NSNumber) для типов (U) Int8 / 16/32/64?
  • Давайте будем гением компьютера.