为什么insertNewObjectForEntityForName只返回NSManagedObject?

时间:2014-06-08 10:17:33

标签: ios core-data swift

我试图将一些RubyMotion代码移动到Swift。到目前为止它的作用。我不明白的是 为什么以下结果不能转换为Document类:

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

insertNewObjectForEntityForName调用返回NSManagedObject类型的对象。 但是,为什么不插入NewObjectForEntityForName会返回由entity.managedObjectClassName指定的Document类型的对象?

我的实体看起来像这样:

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)

4 个答案:

答案 0 :(得分:17)

您需要将@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

将返回正确的类型

答案 1 :(得分:5)

解决方案是将模块名称添加到类名。

e.g。

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

答案 2 :(得分:4)

确保在对象模型中设置实体的类名。格式为YourAppModule.YourClassName

enter image description here

答案 3 :(得分:0)

你试过了吗?

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

这适合我。