2012-04-02 12 views
3

誰かが標準のコアデータセッターを「隠す」方法を教えてもらえますか?コアデータメソッドのクラス拡張

私はObjective-Cの中に「プライベート」メソッドを定義しますが、同様の結果を達成するための拡張機能を使用して読んする方法は本当にありません知っています。問題は、これをコアデータクラスに適用したいということです。私はいくつかの属性のために作成された標準的なセッターを隠して、他の露出されたセッターの中から呼び出すだけです。

例:私のコアデータオブジェクトがBOOL「収集」と日付「dateCollected」を有します。私はsetCollectedにsetDateCollectedを追加する方法を考え出しましたが、今私は 'setCollectedを手動で設定するのを忘れるかもしれません。これらは生きるべきここで、tは知っている。私はドン -

明確にするためには、私をトリップされた部分は、「@dynamic」の呼び出しています。

EDIT - 私は一部を逃したと思います。私は@property宣言を実装ファイルに動かすことができます。しかし、私はセッターが隠され、ゲッターが公開されたままにしておきたい。私は@propertyを置き換える必要があると思いますが、コアデータオブジェクトに対してこれを行う方法はわかりません。何をしようとする

+0

'@ implementation'では? - 彼らは通常どこに住んでいる。 –

+0

@implementationに配置すると、それはまったく隠されていません。 –

答えて

0

あなたは実装ファイルでプライベートメソッドを定義します。ヘッダーファイルにメソッドが表示されていない場合は、そのメソッドは非公開です。明確にするために、パブリックプロパティとメソッドを定義する方法を次に示します。

@interface MyAppViewController : UIViewController 

@property (strong, nonatomic) NSString *myPublicStringObject; 

- (NSString *) myPublicMethodTakingInputString:(NSString *) input; 

@end 

実装ファイルでは、次のようにプライベートプロパティとメソッドを定義できます。

#import "MyAppViewController.h" 

// Declare private properties and methods inside the following interface extension 
@interface MyAppViewController() 

@property (strong, nonatomic) NSNumber  *myPrivateNumber; 
@property (strong, nonatomic) NSString  *myPrivateStringObject; 

- (void) myPrivateMethod1; 
- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input; 

@end 


@implementation MyAppViewController 

@synthesize myPublicStringObject; 
@synthesize myPrivateNumber; 
@synthesize myPrivateStringObject; 

// Implement all methods declared in header and private interfaces here in no particular order 
- (NSString *) myPublicMethodTakingInputString:(NSString *) input 
{ 
// code for myPublicMethodTakingInputString 
} 

- (void) myPrivateMethod1 
{ 
} 

- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input 
{ 
} 


// Implement any other private method not declared 
- (NSString *) myUndeclaredPrivateMethod1:(NSString *) input 
{ 
// code for myUndeclaredPrivateMethod1 
} 


- (id) myUndeclaredPrivateMethod2 
{ 
// code for myUndeclaredPrivateMethod2 
} 

...など

この説明はもちろんのiOSの5のためです。 iOS3 & 4の構文は、プライベートインスタント変数(iVars)がヘッダーファイルに表示される点を除いて同様です。これは、初心者にとっては非常に混乱する可能性があります。インスタント変数をどこにでも表示する必要がないため、iOS 5はこれをクリーンアップしました。

+0

これは近いです - 私は重要な部分を忘れたと思います謝罪) - getterをパブリックに保つ必要があるので、@propertyを置き換える必要がありますが、コアデータエンティティの特別な動作があるかどうかはわかりません。 –

+0

コアデータオブジェクトのカテゴリを実装できます。ドキュメントのカテゴリを参照してください。それらのカテゴリは、中括弧の中にカテゴリ名があることを除いて、プライベートインタフェースのように見えます。たとえば、上の例のオブジェクトを作成するカテゴリは、\ @interface MyAppViewController(Create)//「my code」\ @endのように見えます。 "my code"の中には、オブジェクトを作成するために呼び出すすべてのメソッドがあります。 – Sunny

+0

一般に、@ propertyのセッター部分をオーバーライドすることによって、セッターを非公開にすることができます。例えば。私のオブジェクトの "\ @プロパティ(強い)NSString myObject;"私はsetterを " - (void)setMyObject:(NSString *)string {// setter code}"でオーバーライドできます。これは、誰かがプロパティに代入したいときに呼び出されます。 Voila! – Sunny

1

が良い結果につながる可能性が高いではありません。コアデータクラスは非常に細かくグラフ階層で設定され、プロパティの実装はスーパークラスに存在します。おそらく、収集した変数をelininateし、dateCollectedのnilチェックだけを行うべきでしょう。もう少し複雑なやりかたのやり方は、データモデルからそれを削除し、それを正規のivarにすることです。

EDIT:さて、あなたのコメントの情報を見てみました。実際には、特定のガイドラインを遵守すれば実装を上書きできることを示唆しています。しかし、以下の答えはおそらくより良いでしょう。プロパティをプライベートインターフェイスに移動します。プライベートプロパティの値を返すpublicインターフェイス(readonly)内の別のプロパティを宣言します;)。

+0

dateCollectedは単純な例です(ただし、いいアイデアです)。さらに、私はwillChangeValueForKeyとdidChangeValueForKeyを使用する限り、setterを再定義するのはかなり標準的な方法だと思っていました。それとも、「隠れている」側面だけが病気になっているということですか?私はなぜそれが当てはまるのかわかりません。なぜなら、標準的なセッターはまだ存在するからです。私はコンパイラにそれらを公開していないだけです。 –

+0

標準であるかどうかわかりませんが、私のプロジェクトでは9または10コアデータクラスをそのまま使用しています。コアデータのオーバーライドに関する恐ろしい部分は、NSManagedObjectが何をしているのか正確にはわかりませんし、EXC_BAD_ACCESS土地への高速チケットです。それともどこかでこの情報を見つけましたか?たぶん私よりスマートな方が良い答えがあるのですが、それまでは^^; – borrrden

+0

私はちょうどhttp://stackoverflow.com/questions/172598/best-way-to-define-private-methods-for-a-class-in-objective-cとhttp:// developerの組み合わせから作業していました.apple.com/library/mac /#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html –