我试图将一些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)
答案 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
。
答案 3 :(得分:0)
var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as? Document
这适合我。