30

私が C# で本当に気に入っているのは、ジェネリック リストです。1 種類のオブジェクトのみを含むリスト。Cocoa/Objective-C に一般的なリストのようなものはありますか? 私が知っている限りNSArray、誰がオブジェクトへのポインタを取るかだけです。

4

4 に答える 4

34

Cocoa アプリでこれを望むのは、多くの場合、設計が弱いことを示しています。

NSArray不変であるため、「任意のオブジェクトへのポインターを取得」せず、おそらく、渡されたときに正しいオブジェクトが既に含まれていると思われます。あなたがもっと心配しているNSMutableArrayと思うのは、コードの他の部分が間違った種類のオブジェクトを追加する可能性があると思う場所です。しかし、Cocoa 自体を見てください。クラスの設計の一部として可変配列を公開することは非常にまれです。

代わりに、通常、NSArrayその配列を変更するための 1 つまたは 2 つのメソッドを公開します。次のようなもの:

@class Foo : NSObject
- (NSArray *)bars;
- (void)addBar:(Bar *)bar;
- (void)removeBar:(Bar *)bar;
@end

これにより、通常、コンパイラの警告が表示されるだけで、間違ったオブジェクトが挿入されるのを防ぐことができます。もちろん、必要に応じて、内部にアサーションを追加すること-addBar:-removeBar:できます。

于 2009-04-27T15:27:58.573 に答える
9

Objective-C はジェネリック プログラミングをサポートしていません。Objective-C++ と STL リストはいつでも使用できます。

于 2009-04-27T14:09:00.450 に答える
3

ジェネリック NSArray は、 をサブクラス化しNSArray、提供されたすべてのメソッドをより制限的なメソッドで再定義することによって実現できます。例えば、

- (id)objectAtIndex:(NSUInteger)index

で再定義する必要があります

@interface NSStringArray : NSArray

なので

- (NSString *)objectAtIndex:(NSUInteger)index

NSArray が NSString のみを含むようにします。

作成されたサブクラスは、ドロップイン置換として使用でき、多くの便利な機能をもたらします: コンパイラ警告、プロパティ アクセス、より良いコード作成、および Xcode での補完。これらはすべてコンパイル時の機能であり、実際の実装を再定義する必要はありません。NSArray のメソッドは引き続き使用できます。

これを自動化して、たった 2 つのステートメントにまとめることができます。これにより、ジェネリックをサポートする言語に近づけることができます。テンプレートが C プリプロセッサ マクロとして提供されるWMGenericCollectionで自動化を作成しました。

マクロを含むヘッダー ファイルをインポートした後、インターフェイス用と実装用の 2 つのステートメントを含む汎用 NSArray を作成できます。保存するデータ型とサブクラスの名前を指定するだけです。WMGenericCollection はNSArray、 、 、NSDictionaryおよびNSSetのようなテンプレートと、それに対応する変更可能なテンプレートを提供します。

于 2013-03-14T18:48:33.363 に答える