将模块名称添加到核心数据实体

时间:2014-08-15 01:34:25

标签: swift

我无法弄清楚this note from Apple's "Using Swift with Cocoa and Objective-C"的含义:

  

Swift类是命名空间的 - 它们的作用域是编译它们的模块(通常是项目)。要在您的Core Data模型中使用NSManagedObject类的Swift子类,请在类名前加上模型实体检查器中具有模块名称的“类”字段。

我已经完成了,使用我自己的应用程序和股票主 - 详细信息模板,所以我的实体名称是“Event”,其类是“Stock_Master_Detail.Event”。当我从Create NSManagedObject Subclass菜单中选择Editor并要求它创建一个Swift子类时,它没有将该类命名为正确。 Xcode创建一个名为“Stock_Master_Detail.swift”的文件,该文件名为Stock_Master_Detail。如果我创建多个实体,所有实体都带有前缀的模块名称,Xcode就不能生成多个子类,因为它们最终都会有相同的名称。

如果我只是完全省略模块名称,那么我将补充一点,在我的有限测试中一切正常,与Apple的文档相反。那么我的问题是,没有将模块名称添加到我的班级有什么意义呢?

2 个答案:

答案 0 :(得分:0)

我相信它可能是Swift / Core Data的错误。首先,生成没有模块名称(前缀)的托管对象。生成之后,返回并在核心数据中添加前缀。

答案 1 :(得分:0)

我解决这个问题的一种方法是单独保留数据模型文件,因此在这种情况下,类将是" Event"。然后在创建NSManagedObjectModel的代码中(如果您使用Apple的项目模板,则为AppDelegate),我将其更改为:

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle(forClass: self.classForCoder).URLForResource("Model", withExtension: "momd")!
    var bundleModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    var objectModel = NSManagedObjectModel()
    objectModel.entities = bundleModel.entities.map { ( entity ) -> NSEntityDescription in
        var entityCopy = entity.copy() as NSEntityDescription
        entityCopy.managedObjectClassName = "Stock_Master_Detail." + entity.managedObjectClassName
        return entityCopy
    }

    return objectModel
    }()

一个改进,我想弄清楚如何动态地找到模块名称。我知道我可以解析当前班级的名字,但这感觉比我想要的更奇怪。