Почему insertNewObjectForEntityForName возвращает объект NSManagedObject?

Я пытаюсь переместить код RubyMotion в Swift. Пока это работает. То, что я не понимаю, почему следующий результат не может быть применен к классу Document:

var newObject : NSManagedObject 
  NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext:context) 
  as NSManagedObject

В вызове insertNewObjectForEntityForName возвращается объект типа NSManagedObject. Но почему не вставляетNewObjectForEntityForName возвращает объект типа Document, как указано entity.managedObjectClassName?

Моя сущность выглядит следующим образом:

func DocumentEntity () -> NSEntityDescription {

    var entity = NSEntityDescription()
    entity.name = "Document"
    entity.managedObjectClassName = "Document"

    var property = NSAttributeDescription()
    property.name = "title"
    property.attributeType = NSAttributeType.StringAttributeType
    property.optional = false

    entity.properties = [property]

    return entity
}

class Document : NSManagedObject {
    @NSManaged var title : String
}

model = NSManagedObjectModel()
model.entities = [DocumentEntity()]

var store = NSPersistentStoreCoordinator(managedObjectModel: model)

Ответ 1

Вам нужно добавить @objc(Document) в свой класс Document. Это так, что Core Data (который все еще находится в Objective-C) может работать с вашим классом Swift.

@objc(Document)
class Document : NSManagedObject {
    @NSManaged var title : String
}

Тогда все будет работать:

var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as Document

Вернет правильный тип

Ответ 2

Решение состоит в том, чтобы добавить имя модуля в имя класса.

например.

var entity = NSEntityDescription()
entity.name = "Document"
entity.managedObjectClassName = "TestSwift.Document"

Ответ 3

Убедитесь, что вы задаете имя класса вашего объекта в объектной модели. Формат YourAppModule.YourClassName.

enter image description here

Ответ 4

Вы пытались:

var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as? Document

это работает для меня.