Xcode 7には奇妙な新機能があり、新しいNSManagedObjectサブクラスを生成してから、xcodeが2つのクラスを作成します:エンティティとその完全な実装を含むCoreDataPropertiesカテゴリ。下の図に、私が何を意味するかを示します。
私はこれについて文書化された情報を見つけることができません。
私はこれに気付いただけでなく、それに関するドキュメントを見つけることもできませんでしたが、この新しい機能を試しましたが、このように機能します。 Core Dataモデルから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はカテゴリの2つのファイル(DBUser + CoreDataProperties.hおよびDBUser + CoreDataProperties.m)のみを再生成してモデルのすべてのプロパティを更新しますが、他の2つのファイルには変更を加えません(DBUser.hおよびDBUser.m)これら2つのファイルを使用して、カスタムメソッドやプロパティなどを追加できます。
以前のバージョンでは、Xcodeは常に2つのファイル(DBUser.hおよびDBUser.m)のみを生成し、サブクラスを再生成するたびにカスタム実装が削除されたため、これらのファイルを簡単に変更できなかったため、プロパティをそこに配置しました。したがって、手動でカテゴリを作成し、Xcode 7で表示できるものとは反対の方法でカテゴリにメソッドを配置するのが一般的でした。しかし、メソッドの実装にはカテゴリを使用しないため、多くの欠点がありました特定のことを実行できるようになり、メインインターフェイスと実装ファイルを簡単に変更できるようになりました。ほら!
以前は、生成されたコードは、EntityName + Create.hやEntityName + Create.mなどのインターフェースを使用して「拡張」する必要があるEntityName.hおよびEntityName.mに入りました。
EntityName.mクラスを頻繁に変更してコードを紛失した初心者にとって、これは理解するのが困難でした。
これは正しい方法です。コードジェネレーターは既存のコードを消去しません。
他の答えは、新しいシステムの説明に非常に適しています。
しかし、古いシステムに基づくエンティティがある場合、新しい互換性の問題については誰も話しません。
私の解決策:まだEntityName + Create.mに独自のコードを配置していますが、EntityName + Create.hではEntityName.hだけでなくEntityName + CoreDataProperties.hを参照しています(以前に生成されたEntityName.hおよびEntityNameのコードを空にしました) .m)。このソリューションにより、EntityName + Create.mからコードを移動したり、EntityName + Create.hへのすべての参照を変更したりする必要がなくなりました。
これがお役に立てば幸いです。
SwiftおよびXcode 7の場合、Leszek Sからの回答と同じですが、最初に作成されるファイルは2つだけです。
後で、CoreDataモデルに変更を加えてNSManagedObject
サブクラスを再生成すると、DBUser+CoreDataProperties.Swift
のみが更新されます。 DBUser.Swift
は変更されません。
すべてのコードをDBUser.Swift
に入れてください。