Почему 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
это работает для меня.