为什么insertNewObjectForEntityForName只返回NSManagedObject?

rog*_*rgl 11 core-data ios swift

我正在尝试将一些RubyMotion代码移动到Swift.到目前为止它的作用.我不明白为什么以下结果无法传递给Document类:

var newObject : NSManagedObject 
  NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext:context) 
  as NSManagedObject
Run Code Online (Sandbox Code Playgroud)

insertNewObjectForEntityForName调用返回NSManagedObject类型的对象.但是为什么insertNewObjectForEntityForName不返回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)
Run Code Online (Sandbox Code Playgroud)

mpr*_*vat 17

您需要添加@objc(Document)到Document类.这样Core Data(仍然在Objective-C中)可以处理你的Swift类.

@objc(Document)
class Document : NSManagedObject {
    @NSManaged var title : String
}
Run Code Online (Sandbox Code Playgroud)

那么一切都会奏效:

var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as Document
Run Code Online (Sandbox Code Playgroud)

将返回正确的类型


rog*_*rgl 5

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

例如

var entity = NSEntityDescription()
entity.name = "Document"
entity.managedObjectClassName = "TestSwift.Document"
Run Code Online (Sandbox Code Playgroud)


Ben*_*ieb 0

你试过了吗:

var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as? Document
Run Code Online (Sandbox Code Playgroud)

这对我有用。