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模型?
谢谢!
发布于 2014-06-03 20:55:37
让我们来看看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类的子类中提供属性的底层存储和实现。在与Core数据模型中的属性或关系相对应的托管对象子类中的每个属性定义之前,添加@NSManaged属性。与Objective-C中的@dynamic属性类似,@NSManaged属性通知Swift编译器将在运行时提供属性的存储和实现。但是,与@dynamic不同的是,@NSManaged属性仅适用于核心数据支持。
这就是我如何为Swift重写上面的例子(未测试):
Person.swift
import CoreData
class Person: NSManagedObject {
@NSManaged var name : NSString
}
根据你的问题,我认为子类生成功能可能还没有包含在Xcode6中。当您在Xcode中创建Cocoa-Project时,您是否确保选择了"Swift“作为编程语言?
发布于 2014-06-15 01:54:41
您可以使用NSEntityDescription.insertNewObjectForEntityForName
获取Swift模型,但您必须编辑核心数据模型文件,并且不能将Person
用作类实体,而应使用<ProjectName>.Person
,否则它将返回NSManagedObject
……
使用println()
时,您不会看到Person
实例,而是类似于<_TtC5ProjectName4Person: 0xc9ad5f0>
的内容,但是调用此实例上的方法将证明它是真正的Person
实例。我猜这只是Swift生成唯一类名的方法,而不是冲突,CoreData方法显示了这种内部机制。
Swift类是命名空间的-它们的作用域是编译它们的模块(通常是项目)。要在核心数据模型中使用NSManagedObject类的Swift子类,请在模型实体检查器的class字段中使用模块名称作为类名的前缀。
发布于 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(类名)。请参见下面的示例。
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
保存上下文以提交插入。
https://stackoverflow.com/questions/24015185
复制相似问题