将模块名称添加到核心数据实体
Posted
技术标签:
【中文标题】将模块名称添加到核心数据实体【英文标题】:Adding Module Name to Core Data Entities 【发布时间】:2014-08-15 01:34:25 【问题描述】:我无法弄清楚this note from Apple's "Using Swift with Cocoa and Objective-C" 的含义:
Swift 类是命名空间的——它们的作用域是编译它们的模块(通常是项目)。要将
NSManagedObject
类的 Swift 子类与您的 Core Data 模型一起使用,请在 Class 中为类名添加前缀模型实体检查器中带有模块名称的字段。
我已经这样做了,使用我自己的应用程序和库存主从模板,所以我的实体的名称是“事件”,它的类是“Stock_Master_Detail.Event”。当我从Editor
菜单中选择Create NSManagedObject Subclass
并要求它创建一个Swift 子类时,它没有正确命名该类。 Xcode 为名为@987654325@ 的类创建了一个名为“Stock_Master_Detail.swift”的文件。如果我创建多个实体,所有实体都以模块名称为前缀,Xcode 无法生成多个子类,因为它们最终都会具有相同的名称。
我会补充一点,如果我完全省略模块名称,那么在我有限的测试中一切正常,这与 Apple 的文档相反。那么,我的问题是,不将模块名称添加到我的类有什么影响?
【问题讨论】:
我也有同样的问题。我的应用程序名称包含空格,我已经尝试了模块名称的所有可能组合(使用空格、下划线......)但无济于事。没有模块名称一切正常。 【参考方案1】:我解决此问题的一种方法是单独保留数据模型文件,因此在这种情况下,类将是“事件”。然后在创建 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
()
一个改进,我想弄清楚如何动态找到模块名称。我知道我可以解析当前类的名称,但这感觉比我想要的更奇怪。
【讨论】:
【参考方案2】:我认为这可能是 Swift/Core Data 的一个错误。首先,生成没有模块名称(前缀)的托管对象。生成后,再回去在核心数据中添加前缀。
【讨论】:
以上是关于将模块名称添加到核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章