从Core Data实体生成Swift模型

更新Xcode 8:

在Xcode 8中,需要转到Core Data Model Editor和Show File Inspector。 底部附近是代码生成的选项。 selectSwift。

编辑 :我发现解决scheme从核心数据实体生成一个Swift模型:

在Xcode上:

编辑器>创buildNSManagedOjbect>单击button“下一步”>单击button“下一步”>select“Swift”语言>单击button“创build”


我使用Core Data在Xcode 6 beta上创build了一个新的Swift项目,尝试了Swift langage。

当我从我的Core Data实体生成我的模型时,Xcode创build了Objective-C模型。

有没有一种方法来生成Swift模型,而不是使用核心数据的Obejctive-C模型?

谢谢 !

让我们看看Objective-C的方式:

Person.h (头文件)

#import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface Person : NSManagedObject @property (nonatomic, retain) NSString *name; @end 

Person.m (执行文件)

 #import "Person.h" @implementation Person @dynamic name; @end 

迅速

Xcode6-Beta中包含的文档说:

核心数据提供NSManagedObject类的子类中的属性的基础存储和实现。 在托pipe对象子类中与Core数据模型中的属性或关系相对应的每个属性定义之前添加@NSManaged属性。 像Objective-C中的@dynamic属性一样,@ NSManaged属性通知Swift编译器,在运行时将提供属性的存储和实现。 但是,与@dynamic不同,@ NSManaged属性仅适用于Core Data支持。

所以这就是我将重写上面的例子Swift(未testing):

Person.swift

 import CoreData class Person: NSManagedObject { @NSManaged var name : NSString } 

而根据你的问题,我认为子类生成function可能不包括在Xcode6呢。 当你在Xcode中创buildCocoa项目时,你是否确定select了“Swift”作为编程语言?

您可以使用NSEntityDescription.insertNewObjectForEntityForName返回Swift模型,但是您必须编辑您的核心数据模型文件,不要使用Person作为类实体,但<ProjectName>.Person否则返回NSManagedObject

使用println()你不会看到Person实例,但像<_TtC5ProjectName4Person: 0xc9ad5f0>类似的东西,但调用这个方法将certificate这是一个真实的Person实例。 我想这只是Swift生成唯一类名的方式,而不是冲突,CoreData方法显示了这种内部机制。

苹果文档说 :

Swift类是命名空间的 – 它们的作用范围是它们被编译的模块(通常是项目)。要将NSManagedObject类的Swift子类与Core Data模型一起使用,请在模型实体的Class字段中前缀类名称检查员与您的模块的名称。

根据苹果公司关于核心数据框架中新增内容的video:38分钟(WWDC2014会话225),在检查员的数据模型中,将类名称加上项目名称。 像projectName.Doctor一样

我已经尝试过,但会发生什么事是生成托pipe对象类变成: projectName.swift而不是Doctor.swift 。 即使类声明也成为类projectName:ManagedObject

解:

在数据模型检查器中,只需指定您的对象的名称和类别,以您想要的名称命名, 例如:Doctor

在生成对象模型并selectSwift之后,这将创build一个文件( Doctor.swift )。

现在,在Core Data中插入新logging时,即使您将新插入的对象转换为正确的对象名称,也可能遇到“找不到类,找不到NSManagedObject”的错误。

要解决这个问题,只需要在类声明上面添加@objc(类名) 。 见下面的示例。

 import Foundation import CoreData @objc(Doctor) class Doctor: NSManagedObject { @NSManaged var name: String } 

然后:

 let doctorManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Doctor", inManagedObjectContext: context) as Doctor doctorManagedObject.name = "John" // you can now use dot syntax instead of setValue 

保存上下文来提交插入。

我testing了@NSManaged,它没有工作。 :(。但是由xcdatamodel生成的混合模型文件(.h),它会成功。请阅读https://github.com/iascchen/SwiftCoreDataSimpleDemo中的文档和代码;

另外,你可以在Xcode为你生成的桥接头文件Project-Bridging-Header.h中添加#import "Person.h" (如果你接受了它的产生要求)。 那么你可以使用所有自动生成的Obj-C,就好像它是本地的Swift一样。

编辑器 – > 创buildNSManagedObject子类适用于Swift

简单地通过所有通常的步骤,但是当你开始创build文件的时候,如果你是第一次使用Swift项目创buildNSManagedObject子类 ,那么selectLanguage Swift就会默认Objective C