首页 文章

从Core Data实体生成Swift模型

提问于
浏览
50

Update for Xcode 8:

在Xcode 8中,需要转到Core Data Model Editor和Show the File Inspector . 靠近底部是代码生成的选项 . 选择Swift .

Edit :我找到了从Core Data实体生成Swift模型的解决方案:

在Xcode上:

编辑>创建NSManagedOjbect>单击按钮"Next">单击按钮"Next">选择"Swift" Langage>单击按钮"Create"


我使用Core Data在Xcode 6 beta上创建了一个新的Swift项目,尝试了Swift语言 .

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

有没有办法用Core Data生成Swift模型而不是Obejctive-C模型?

谢谢 !

6 回答

  • 30

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

    Person.h ( Headers 文件)

    #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中 . 当您在Xcode中创建Cocoa-Project时,您是否确定已选择“Swift”作为编程语言?

  • 11

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

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

    Apple documentation says

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

  • 2

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

    我试过了,但会发生的是生成的托管对象类变为: projectName.swift 而不是 Doctor.swift . 即使是阶级声明也变成 class projectName: ManagedObject

    Solution:

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

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

    现在,在Core Data中插入新记录时,即使将新插入的对象强制转换为正确的对象名,也可能会出现错误"Class not found, using default NSManagedObject instead" .

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

    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

    我测试了@NSManaged,它没用 . :( . 但是由xcdatamodel生成的混合模型文件(.h),它成功 . 请阅读https://github.com/iascchen/SwiftCoreDataSimpleDemo中的文档和代码

  • 3

    或者,您可以将 #import "Person.h" 添加到Xcode为您生成的桥接头 Project-Bridging-Header.h (如果您接受它的生成要约) . 然后你就可以使用所有自动生成的Obj-C,就好像它是原生的Swift一样 .

  • 12

    编辑器 - >创建NSManagedObject子类适用于Swift

    只需完成所有常用步骤,但是当您创建文件时,选择语言'Swift'如果它使用了Swift项目创建NSManagedObject子类,它将默认为Objective C

相关问题