【问题标题】: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)

【问题讨论】:

    标签: ios core-data swift


    【解决方案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”是您的项目名称。
    • 处理这个问题的正确方法是我的回应。 stackoverflow.com/a/24786866/1281407
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你试过了吗:

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

      这对我有用。

      【讨论】:

      • 作为? NSManagedObject 返回对象但作为?文档返回 nil
      • 某些 Core Data 类也发生在我身上。
      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多