xcode 7使用额外的CoreDataProperties类别生成核心数据实体

我在xcode 7有奇怪的新function,当我生成新的NSManagedObject子类,然后xcode创build两个类:实体和它们的CoreDataProperties类别,其中包含完整的实现。 下面的图片是我的意思。

在这里输入图像说明

我找不到任何有关这方面的logging信息,谁可以解释它为什么这样工作

我只是注意到这一点,也找不到任何有关它的文档,但我已经尝试了这个新function,它的工作原理是这样的。 当你首先从核心数据模型生成NSManagedObject子类时,Xcode将生成4个文件:

DBUser.h

#import <Foundation/Foundation.h> #import <CoreData/CoreData.h> NS_ASSUME_NONNULL_BEGIN @interface DBUser : NSManagedObject // Insert code here to declare functionality of your managed object subclass @end NS_ASSUME_NONNULL_END #import "DBUser+CoreDataProperties.h" 

DBUser.m

 #import "DBUser.h" @implementation DBUser // Insert code here to add functionality to your managed object subclass @end 

DBUSER + CoreDataProperties.h

 #import "DBUser.h" NS_ASSUME_NONNULL_BEGIN @interface DBUser (CoreDataProperties) @property (nullable, nonatomic, retain) NSNumber *id; @property (nullable, nonatomic, retain) NSString *name; @end NS_ASSUME_NONNULL_END 

DBUSER + CoreDataProperties.m

 #import "DBUser+CoreDataProperties.h" @implementation DBUser (CoreDataProperties) @dynamic id; @dynamic name; @end 

所以现在你可以看到所有的属性都在一个单独的文件(CoreDataProperties)中。 稍后如果为相同的模型生成NSManagedObject子类,Xcode 7将仅重新创build2个具有类别(DBUser + CoreDataProperties.h和DBUser + CoreDataProperties.m)的文件,以更新模型中的所有属性,但不会更改其他两个文件(DBUser.h和DBUser.m),所以你可以使用这两个文件来添加一些自定义的方法或属性等

在以前的版本中,Xcode始终只生成2个文件(DBUser.h和DBUser.m),并将属性放在那里,所以不能轻松修改这些文件,因为每次重新生成子类时都会删除自定义实现。 因此,手动创build一个类别并将您的方法放在与Xcode 7中我们可以看到的相反的类别中是一种常见的做法。然而,这存在很多缺点,因为我们不得不使用一个类来实现我们的方法,允许做某些事情,现在我们可以很容易地修改主界面和实现文件,使我们可以做任何事情。 欢呼!

以前生成的代码进入了一个EntityName.h和EntityName.m,你必须用一个接口(比如EntityName + Create.h和EntityName + Create.m)“扩展”。

对于经常修改EntityName.m类并丢失代码的初学者来说,这很难理解。

现在它是正确的:代码生成器不会擦除现有的代码。

其他答案非常擅长解释新系统。

但是如果您有基于旧系统的实体,则没有人会谈到新的兼容性问题。

我的解决scheme:我仍然把我自己的代码在EntityName + Create.m,但在EntityName + Create.h我引用EntityName + CoreDataProperties.h而不是只是EntityName.h(我清空以前生成的代码在EntityName.h和EntityName .M)。 这个解决scheme避免了我从EntityName + Create.m移动我的代码,并改变了所有对EntityName + Create.h的引用。

我希望这对你有帮助。

对于Swift和Xcode 7,它和Leszek S的答案是一样的,但最初只创build了2个文件:

  • DBUser.swift
  • DBUSER + CoreDataProperties.swift

之后,如果对CoreData模型进行更改并重新生成NSManagedObject子类,则只会更新DBUser+CoreDataProperties.swiftDBUser.swift保持不变。

所以把你所有的代码放在DBUser.Swift