Подтвердить что ты не робот

Почему я могу использовать NSManagedObject, но не для моего типа сущности?

Я использую код шаблона Swift для Core Data в новом проекте. Мой файл .xcdatamodeld имеет единый объект, определенный (Task) с одним атрибутом (name).

У меня есть файл Task.swift, который выглядит так:

import CoreData

class Task: NSManagedObject {
    @NSManaged var name: String
}

Когда я запускаю это, он работает:

var firstTask = NSEntityDescription.insertNewObjectForEntityForName("Task",
    inManagedObjectContext: managedObjectContext) as NSManagedObject

firstTask.setPrimitiveValue("File my TPS reports", forKey: "name")

var error: NSError?

managedObjectContext.save(&error)

Я даже могу зайти в базу данных SQLite, используемую симулятором iOS, и подтвердить, что строка была добавлена.

Однако, когда я запускаю тот же самый код, что и выше, но с as Task вместо as NSManagedObject, я получаю сообщение об ошибке с сообщением об ошибке Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0), связанным с линией var firstTask.... Если я продолжу выполнение, я получаю EXC_BAD_ACCESS и 0 misaligned_stack_error_ в верхней части Thread 1 каждый раз, когда я его продвигаю.

Почему этот приведение может привести ко всему этому?

4b9b3361

Ответ 1

Убедитесь, что поле "Имя класса" на самом деле Модуль. Task, где Модуль - это имя вашего приложения. Классы CoreData в Swift - это пространство имен. Прямо сейчас ваш объект вытаскивается из контекста как объект NSManagedObject, а не как Task, поэтому as-cast не работает.

Ответ 2

Это даже разочарование, если вы пробовали все вышеперечисленные предложения и не работали для меня!

Итак, это то, что работает для меня.

1- Выберите файл xcdatamodeld

2- Убедитесь, что все ваши объекты не имеют модуля в "Модель данных" Inspector ", если вы видите" Model: Current Product Module "..Почему это так, что это похоже на прикрепленное изображение.

3- Удалить ваше приложение для очистки основных данных

4- Если все еще не работает, удалите свои объекты и восстановите их.

введите описание изображения здесь

Ответ 3

Вам нужно изменить файл Task.swift. Добавление @objc (Task), как показано ниже

import CoreData

@objc(Task)
class Task: NSManagedObject {
    @NSManaged var name: String
}

Я думаю, что это ошибка, если ваш проект не содержит кодов objective-c. Однако вам нужно добавить эту строку до тех пор, пока это не будет исправлено.

Я узнал это отсюда.

Youtube видео в 11:45

Ответ 4

Я думаю, только изменение поля класса в .xcdatamodel больше не работает, потому что у меня все еще есть следующее исключение: фатальная ошибка: использование нереализованного инициализатора "init (entity: insertIntoManagedObjectContext:)" для класса

Итак, я ввел этот код в свой собственный класс:

    init(entity: NSEntityDescription!,
    insertIntoManagedObjectContext context: NSManagedObjectContext!) {
        super.init(entity: entity, insertIntoManagedObjectContext: context)
}

Вдруг это сработало! NSManagedObject теперь недоступен для моего пользовательского класса. Я не могу понять, почему это решение, но оно работает:)

Ответ 5

Обновление для @Ben Gottlieb в соответствии с XCode 7.1 и Swift 2.0

  • добавить @objc в свой класс. См. Ответ Оуэна Чжао. Ниже приведен пример:
@objc
class ImageRecordMO: NSManagedObject{
  1. Откройте файл .xcdatamodled.

  2. Выберите свою сущность и щелкните инспектора модели данных на правой панели.

  3. Введите имя класса, см. рисунок ниже

  4. Выберите ваш модуль, чтобы быть текущим модулем продукта, см. рисунок ниже.

введите описание изображения здесь

Ответ 6

Xcode 7 + Swift 2

Person.swift

@objc(Person)
class Person: NSManagedObject {
}

Модель данных

введите описание изображения здесь

Затем просто вызовите

let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: self.managedObjectContext) as! Person

Ответ 7

Мне пришлось добавить @objc() и установить класс в интерфейсе coredata​​strong > . В правом окне CoreData в области Entity есть текстовое поле Name и Class. Класс не должен быть MSManagedObject, а вместо этого ваш класс. Я создал простой рабочий пример!

Ответ 8

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

Я добавил объявление @objc в сгенерированные подклассы, но удалил любой префикс пространства имен в имени класса в объектной модели (у него был префикс по умолчанию "PRODUCT_MODULE_NAME." после создания подклассов). Это сработало.