从Core Data实体生成Swift模型

Jea*_*ent 50 xcode model core-data nsmanagedobject swift

Xcode 8更新:

在Xcode 8中,需要转到Core Data Model Editor和Show the File Inspector.靠近底部是代码生成的选项.选择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模型?

谢谢 !

wot*_*pal 30

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

Person.h(头文件)

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)

Person.m(实现 - 文件)

#import "Person.h"

@implementation Person
@dynamic name;
@end
Run Code Online (Sandbox Code Playgroud)

迅速

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

}
Run Code Online (Sandbox Code Playgroud)

根据你的问题,我认为子类生成功能可能还没有包含在Xcode6中.当您在Xcode中创建Cocoa-Project时,您是否确定已选择"Swift"作为编程语言?

  • 注意:要使用此示例,您必须在课前放置@objc(Person).否则,任何访问Person实例的尝试都将导致崩溃.谢谢你的回答! (5认同)
  • 仅供参考,Xcode 6 beta 3允许自动创建托管对象子类(尽管恼人的默认是Objective-C,即使在Swift项目中也是如此) (3认同)
  • 是的,我可以确认在这个版本的Xcode中没有为swift包含子类生成功能. (2认同)

Fab*_*nso 12

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

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

苹果的文件说:

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


Zal*_*ldy 11

根据Apple关于CoreData框架内新功能的视频:38分钟(WWDC2014会话225),在检查员的数据模型中,使用项目名称为类名添加前缀.喜欢projectName.Doctor

我试过这个,但会发生的是生成的托管对象类变为:projectName.swift而不是Doctor.swift.甚至类声明也变成了类projectName:ManagedObject

解:

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

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

现在,在Core Data中插入新记录时,即使将新插入的对象强制转换为正确的对象名,也可能会出现"未找到类,使用默认NSManagedObject"的错误.

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

import Foundation
import CoreData

@objc(Doctor)
class Doctor: NSManagedObject {
    @NSManaged var name: String
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

保存上下文以提交插入.