7

私はこのようなデザインの選択に頻繁に遭遇し、少し苦労します。私は他のいくつかの視点を探しています。

私はしばしば、基本的に単なる値のセットである状態のリストを保持したり、状態のチャンクを渡したりしたいと思います。値はプリミティブ型になる傾向があります:float、NSTimeIntervals、CGPointsなど。

私の最初の傾向は、これらのプロパティのセットに対してC構造体を作成することです。

typedef struct _STATE {
    float foo;
    NSTimeInterval elapsed;
    CGPoint point;
} STATE;

しかし、C構造体はネイティブのCocoaコレクションクラス(NSArray、、 )NSSetNSDictionaryうまく連携せず、それらの多くを使用して多くの状態を追跡すると、Cocoaに適した残りのコードの粒子に反するように感じます。構造体の配列を直接管理し、メッセージなどで構造体ポインタを渡します。

一方、生のパフォーマンスは必ずしも重要ではないため、これらの値をNSDictionaryにエンコードして、すべてをNSValueまたはNSNumberでラップすることはできますが、結果の構文はほとんど簡潔ではなく、少し壊れやすく、実行時に型と名前の正確さが要求されます。挿入とルックアップの両方:

[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
... 
float something = [[stateDict objectForKey:@"bar"] floatValue];

また、NSTimeIntervalなどの一部のタイプは、一部の(議論の余地のある)ハッカーでのみ使用できます(この場合は2倍に型キャストされます)。

最後に、プライベートメンバーデータとゲッター/セッターのみを使用して、データのみのコンテナーオブジェクトを作成できました。(これらはJavaでは「beans」と呼ばれます。)これらは辞書よりもアクセスが簡単で、構造体よりもCocoaですが、特に状態管理に使用される「内部クラス」としてのみ必要な場合は、やり過ぎのように感じます。単一のオブジェクトタイプの内部。

ココアプログラミングの大衆であるあなたはどうやってこれをしますか?

4

2 に答える 2

14

状況に応じて、任意のデータに NSDictionary クラスを使用して実行するか、コンテナー クラスを作成します (Objective C の @property/synthesize タグにより、これが非常に簡単になります)。ヘッダー ファイルに ObjC を使用する場合:

@interface StateObject : NSObject {
    NSNumber *foo;
    NSTimeInterval *elapsed;
    CGPoint point;
}

@property (retain) NSNumber *foo;
@property (retain) NSTimeInterval *elapsed;
@property (copy)   CGPoint point;

@end

その後@synthesize <variable>、.m ファイルで使用して、セッター/ゲッターを自動的に作成できます。次に、匿名の NSNumbers はまだ面倒ですが、次のことができます。

myStateObject.foo = [NSNumber numberWithFloat:7.0];

これにより、ほとんどの問題が解消され、Cocoa コレクション クラスを使用してデータをより適切にシャッフルできるようになります。

于 2010-02-15T22:56:54.153 に答える