Я дублирую существующее приложение телешоу Objective-C в новую версию Swift с использованием Xcode 6.1, и у меня возникли проблемы с CoreData.
Я создал модель из 4 сущностей, создал их подкласс NSManagedObject (в Swift), и для всех файлов установлены правильные цели приложения (для «Компиляция источников»).
Я все еще получаю эту ошибку всякий раз, когда пытаюсь вставить новую сущность:
CoreData: предупреждение: невозможно загрузить класс с именем «Shows» для сущности «Shows». Класс не найден, вместо этого используется NSManagedObject по умолчанию.
Несколько комментариев:
При сохранении в Core Data я использую родительско-дочерний контекст, чтобы разрешить фоновую потоковую передачу. Я делаю это, настраивая ManagedObjectContext, используя:
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
и сохраняя данные с помощью:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
context.parentContext = self.managedObjectContext!
...rest of core data saving code here...
})
@objc(MyClass)
Но для тех, кто использует
@objc(myEntity)
Swift (например, я), вы можете использовать другое решение, которое работает без сбоев.В правильном классе xcdatamodel в. Он должен выглядеть так:
Ну вот.
Module.Class
является шаблоном для CoreData в Swift и XCode 6. Та же процедура вам понадобится при использовании класса Custom Policy в Model Policy или других материалах CoreData. Примечание: на изображении имя и класс должны быть Car и MyAppName.Car (или любое другое имя вашей сущности). ВотUser
опечатка.источник
Car
как раз для обоих полей свое дело.При использовании Xcode 7 и чисто Swift мне фактически пришлось удалить
@objc(MyClass)
из моего автоматически сгенерированногоNSManagedObject
подкласса (сгенерированного из Editor> Create NSManagedObject Subclass...).источник
В Xcode 7 beta 2 (и я считаю, что 1) в конфигурации модели новый управляемый объект типа
File
установлен в Module,Current Product Module
а класс объекта отображается в конфигурации как.File
.Удаление параметра модуля, чтобы он оставался пустым, или удаление точки, чтобы имя класса в конфигурации было просто
File
эквивалентными действиями, поскольку каждое из них вызывает другое изменение. Сохранение этой конфигурации устранит описанную ошибку.источник
В Xcode 6.1.1 вам не нужно добавлять атрибут @objc, поскольку базовая сущность является подмножеством класса objc (NSManagedObject) (см. Совместимость типов Swift . В CoreData требуется полное имя Module.Class. Имейте в виду, что модуль name - это то, что задано в Build Settings -> Packaging -> Product Module Name. По умолчанию для него установлено значение $ (PRODUCT_NAME: c99extidentifier), которое будет именем Target .
источник
my-product
вmy_product
, и это имело все значение для Core Data.В версии xCode 7 и Swift 2.0 вам не нужно добавлять @objc (NameOfClass), просто измените настройки объекта на вкладке «Показать инспектор модели данных», как показано ниже -
Имя - «Имя вашей организации»
Класс - «Имя вашей сущности»
Модуль - «Текущий модуль продукта»
Код для файла класса Entity будет похож (в моем коде Entity is Family) -
Этот пример отлично работает в моем приложении с xCode 7.0 + swift 2.0
источник
Не забудьте заменить
PRODUCT_MODULE_NAME
на название модуля вашего продукта.Когда создается новый объект, вам нужно перейти в инспектор модели данных (последняя вкладка) и заменить его
PRODUCT_MODULE_NAME
именем вашего модуля, иначеclass not found
при создании постоянного координатора хранилища возникнет ошибка.источник
Вам также необходимо использовать (по крайней мере, с Xcode 6.3.2) Module.Class при выполнении вашего приведения, например: Предполагая, что ваш модуль (т.е. имя продукта) - Food, а ваш класс - Fruit
Резюме:
источник
Я также столкнулся с аналогичной проблемой, выполните следующие действия, чтобы решить :
источник
Изменение имени класса сущности в редакторе модели данных в соответствии с рассматриваемым классом и добавление
@objc(NameOfClass)
в файл каждого NSManagedObject прямо над объявлением класса решило эту проблему для меня во время модульного тестирования.источник
Что сработало для меня (Xcode 7.4, Swift), так это изменение имени класса на
<my actual class name>.<entity name>
в инспекторе сущностей, поле «Класс».Мой инициатор подкласса управляемых объектов выглядит так:
источник
Для Xcode 11.5: если свойство Codegen является определением класса, и если вы не получаете предложение для объекта, созданного в xcdatamodel. Попробуйте выйти из Xcode и снова открыть проект. Меня устраивает. Этот ответ предоставляется только в том случае, если вы не получаете предложений, но если ваш файл не создается, попробуйте любой из приведенных выше ответов.
источник