从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