首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从核心数据实体生成Swift模型

从核心数据实体生成Swift模型
EN

Stack Overflow用户
提问于 2014-06-03 20:28:37
回答 7查看 43.6K关注 0票数 52

Xcode8的更新:

在Xcode8中,用户需要转到Core Data Model Editor并显示File Inspector。底部附近是一个用于代码生成的选项。选择Swift。

Swift编辑:我找到了从核心数据实体生成模型的解决方案:

在Xcode上:

编辑器>创建NSManagedOjbect >单击按钮“下一步”>单击按钮“下一步”>选择"Swift“语言>单击按钮”创建“

我尝试了Swift langage,使用Core Data在Xcode6beta上创建了一个新的Swift项目。

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

有没有办法用核心数据生成Swift模型而不是Obejctive-C模型?

谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-06-03 20:55:37

让我们来看看Objective-C的方法:

Person.h (标头-文件)

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString *name;
@end

Person.m (实施-文件)

代码语言:javascript
复制
#import "Person.h"

@implementation Person
@dynamic name;
@end

斯威夫特

已经包含在Xcode6-Beta中的文档说:

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

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

Person.swift

代码语言:javascript
复制
import CoreData

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

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

票数 32
EN

Stack Overflow用户

发布于 2014-06-15 01:54:41

您可以使用NSEntityDescription.insertNewObjectForEntityForName获取Swift模型,但您必须编辑核心数据模型文件,并且不能将Person用作类实体,而应使用<ProjectName>.Person,否则它将返回NSManagedObject……

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

The Apple documentation says

Swift类是命名空间的-它们的作用域是编译它们的模块(通常是项目)。要在核心数据模型中使用NSManagedObject类的Swift子类,请在模型实体检查器的class字段中使用模块名称作为类名的前缀。

票数 12
EN

Stack Overflow用户

发布于 2014-09-22 17:58:16

根据苹果公司关于CoreData frame新特性的视频:38分钟(WWDC2014会话225),在检查员的数据模型中,在类名前面加上项目名。像projectName.Doctor一样

我已经尝试过了,但是生成的托管对象类将变成:projectName.swift而不是Doctor.swift。甚至类声明也变成了类projectName: ManagedObject

解决方案:

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

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

现在,在核心数据中插入新记录时,即使将新插入的对象转换为正确的对象名称,也可能会遇到错误"Class not found,using default NSManagedObject“。

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

代码语言:javascript
复制
import Foundation
import CoreData

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

然后:

代码语言:javascript
复制
let doctorManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Doctor", inManagedObjectContext: context) as Doctor
doctorManagedObject.name = "John" // you can now use dot syntax instead of setValue

保存上下文以提交插入。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24015185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档