为啥 insertNewObjectForEntityForName 只返回一个 NSManagedObject?
Posted
技术标签:
【中文标题】为啥 insertNewObjectForEntityForName 只返回一个 NSManagedObject?【英文标题】:Why does insertNewObjectForEntityForName only return a NSManagedObject?为什么 insertNewObjectForEntityForName 只返回一个 NSManagedObject? 【发布时间】:2014-06-08 10:17:33 【问题描述】:我正在尝试将一些 RubyMotion 代码移至 Swift。到目前为止它有效。我不明白的是 为什么不能将以下结果转换为 Document 类:
var newObject : NSManagedObject
NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext:context)
as NSManagedObject
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)
【问题讨论】:
【参考方案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
将返回正确的类型
【讨论】:
这一直困扰着我一段时间,但这解决了我的问题。谢谢! 这行得通,但我想知道这是否真的是正确的方式,或者@rogergl 的方式是否正确。【参考方案2】:解决办法是在类名后面加上模块名。
例如
var entity = NSEntityDescription()
entity.name = "Document"
entity.managedObjectClassName = "TestSwift.Document"
【讨论】:
这也适用于 Xcode CoreData 模型编辑器,其中“TestSwift”是您的项目名称。 处理这个问题的正确方法是我的回应。 ***.com/a/24786866/1281407【参考方案3】:确保在对象模型中设置实体的类名。格式为YourAppModule.YourClassName
。
【讨论】:
【参考方案4】:你试过了吗:
var document = NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext: context) as? Document
这对我有用。
【讨论】:
作为? NSManagedObject 返回对象但作为?文档返回 nil 某些 Core Data 类也发生在我身上。以上是关于为啥 insertNewObjectForEntityForName 只返回一个 NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 glTranslatef?为啥不直接更改渲染坐标?
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?