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模型?
谢谢!
答案 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方法显示了这种内部机制。
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)