私が C# で本当に気に入っているのは、ジェネリック リストです。1 種類のオブジェクトのみを含むリスト。Cocoa/Objective-C に一般的なリストのようなものはありますか? 私が知っている限りNSArray
、誰がオブジェクトへのポインタを取るかだけです。
4 に答える
Cocoa アプリでこれを望むのは、多くの場合、設計が弱いことを示しています。
NSArray
不変であるため、「任意のオブジェクトへのポインターを取得」せず、おそらく、渡されたときに正しいオブジェクトが既に含まれていると思われます。あなたがもっと心配しているNSMutableArray
と思うのは、コードの他の部分が間違った種類のオブジェクトを追加する可能性があると思う場所です。しかし、Cocoa 自体を見てください。クラスの設計の一部として可変配列を公開することは非常にまれです。
代わりに、通常、NSArray
その配列を変更するための 1 つまたは 2 つのメソッドを公開します。次のようなもの:
@class Foo : NSObject
- (NSArray *)bars;
- (void)addBar:(Bar *)bar;
- (void)removeBar:(Bar *)bar;
@end
これにより、通常、コンパイラの警告が表示されるだけで、間違ったオブジェクトが挿入されるのを防ぐことができます。もちろん、必要に応じて、内部にアサーションを追加すること-addBar:
も-removeBar:
できます。
Objective-C はジェネリック プログラミングをサポートしていません。Objective-C++ と STL リストはいつでも使用できます。
ジェネリック 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
のようなテンプレートと、それに対応する変更可能なテンプレートを提供します。