web-dev-qa-db-ja.com

xcode 7は、CoreDataPropertiesカテゴリが追加されたコアデータエンティティを生成します

Xcode 7には奇妙な新機能があり、新しいNSManagedObjectサブクラスを生成してから、xcodeが2つのクラスを作成します:エンティティとその完全な実装を含むCoreDataPropertiesカテゴリ。下の図に、私が何を意味するかを示します。

enter image description here

私はこれについて文書化された情報を見つけることができません。

35

私はこれに気付いただけでなく、それに関するドキュメントを見つけることもできませんでしたが、この新しい機能を試しましたが、このように機能します。 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で表示できるものとは反対の方法でカテゴリにメソッドを配置するのが一般的でした。しかし、メソッドの実装にはカテゴリを使用しないため、多くの欠点がありました特定のことを実行できるようになり、メインインターフェイスと実装ファイルを簡単に変更できるようになりました。ほら!

46
Leszek Szary

以前は、生成されたコードは、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へのすべての参照を変更したりする必要がなくなりました。

これがお役に立てば幸いです。

2
Nicolas Gros

SwiftおよびXcode 7の場合、Leszek Sからの回答と同じですが、最初に作成されるファイルは2つだけです。

  • DBUser.Swift
  • DBUser + CoreDataProperties.Swift

後で、CoreDataモデルに変更を加えてNSManagedObjectサブクラスを再生成すると、DBUser+CoreDataProperties.Swiftのみが更新されます。 DBUser.Swiftは変更されません。

すべてのコードをDBUser.Swiftに入れてください。

0
Murray Sagal