从Core Data实体生成Swift模型

时间:2014-06-03 12:28:37

标签: xcode core-data model swift nsmanagedobject

Xcode 8的更新:

在Xcode 8中,需要转到核心数据模型编辑器和显示文件检查器。靠近底部是代码生成的选项。选择Swift。

编辑:我找到了从Core Data实体生成Swift模型的解决方案:

在Xcode上:

编辑器>创建NSManagedOjbect>点击“下一步”按钮>点击“下一步”按钮>选择“Swift”Langage>点击“创建”按钮


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

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

有没有办法用Core Data生成Swift模型而不是Obejctive-C模型?

谢谢!

7 个答案:

答案 0 :(得分:30)

让我们看看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中已包含的文档说:

  

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

这就是我如何为Swift重写上面的例子(未经测试):

<强> Person.swift

import CoreData

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

根据你的问题,我认为子类生成功能可能尚未包含在Xcode6中。你确定已经选择了&#34; Swift&#34;在Xcode中创建Cocoa-Project时的编程语言?

答案 1 :(得分:12)

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

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

Apple documentation says

  

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

答案 2 :(得分:11)

根据Apple关于新的In CoreData框架的视频:38分钟(WWDC2014会话225),在检查员的数据模型中,在类名前面加上项目名称。喜欢 projectName.Doctor

我已经尝试了这一点,但会发生的是生成的托管对象类变为: projectName.swift 而不是 Doctor.swift 。甚至类声明都变成类projectName:ManagedObject

<强>解决方案:

在数据模型检查器中,只需指定名称&amp;您想要的名称对象的类别,示例:医生

生成对象模型并选择Swift后,将创建一个文件( Doctor.swift )。

现在,在Core Data中插入新记录时,即使您将新插入的对象转换为a,也可能会使用默认的NSManagedObject而不是找到类&#34; Class的体验错误#34; 正确的对象名称。

要解决此问题,您只需在类声明上方添加 @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

保存上下文以提交插入。

答案 3 :(得分:3)

我测试了@NSManaged,它没有用。 :(。 但是由xcdatamodel生成的混合模型文件(.h),它成功了。 请阅读https://github.com/iascchen/SwiftCoreDataSimpleDemo

中的文档和代码

答案 4 :(得分:3)

或者,您只需将#import "Person.h"添加到Xcode为您生成的桥接标题Project-Bridging-Header.h(如果您接受了它的生成优惠)。然后你可以使用所有自动生成的Obj-C,就像它是原生的Swift一样。

答案 5 :(得分:2)

编辑 - &gt; 创建NSManagedObject子类适用于Swift

只需完成所有常规步骤,但是当您创建文件时,请选择语言&#39; Swift&#39;如果您第一次在Swift项目中使用创建NSManagedObject Subclass ,它将默认为Objective C

答案 6 :(得分:0)

对于XCode 12。

您可以更改生成模型的语言。 enter image description here