为啥 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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]