2012-02-24 12 views
1

iosにカスタムクラス型の配列を宣言する必要はありますか。たとえば、GenericProductというカスタムクラスがある場合、この型のオブジェクトの配列をNSArrayまたはNSMutableArrayではなくiosで宣言する方法があります。潜在的にあなたがサブクラス化と確保できたものの、事前にobj C/iosで既知のカスタムクラス型の配列を宣言する

おかげで

答えて

0

本当に、唯一の有効なタイプは、クラスに挿入されませんでした。

Objective-Cは動的に型指定されたシステムなので、コンテナの型をそのように強制するのは不自然です。結果として予期せず破損することがあります(JSONパーサーが、 NSNumber、NSStringのとnsnullをオブジェクト?

+0

を使って現実世界の例私はこれを行う場合のおかげでそんなに.. – inforeqd

1

すべてのObjective-Cのオブジェクトが心臓C構造体であるので、あなただけの

GenericProduct *array[5]; 

それとも場合のように、あなたのObjective-CのオブジェクトのプレーンなC配列を、宣言することができますオブジェクトを配列に挿入するときに型チェックを強制することを意味します。潜在的には、NSMutableArrayクラスをサブクラス化してchecを実行できますしかし、これは本当に必要なことではありません。

+0

しかし、私はmalloc関数を使用してメモリを割り当てる必要がありますし、利便性を使用することはできないだろうと思い、同意nsarrayのイニシャライザなどは正しいですか? – inforeqd

+0

はい、NSArray/NSMutableArrayをサブクラス化して型チェックを実行したくない場合は、そうする必要があります。真剣に、しかし、あなたは一般的なNSArrayを使用し、他の場所であなたの型チェックを行う必要があります。 – futureelite7

+0

これを確認していただきありがとうございます:-) ..私はサブクラス化の代わりに動的であるようにデザインを選ぶでしょう。 – inforeqd

0

ここでジェネリックスでは、NSArrayにどのような型が含まれているかを指定します。例えば

NSMutableArray<GenericProduct *> *array = [NSMutableArray array]; 

同じことがスウィフト

var array = [GenericProduct]() 

以上の明示的

var array = Array<GenericProduct>() 

で行うことができます今、スウィフトは、厳密には、このタイプのチェックを強制します。 ObjCでは、これは単に人間の開発者のためのガイドラインに過ぎず、コンパイル時にエラーを投げることはありません。

明らかに、@ futureelite7が記載されているC配列オプションがあります。

Apple's ObjC Runtime Library

int numberOfClasses = objc_getClassList(NULL, 0); 
Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numberOfClasses); 
numberOfClasses = objc_getClassList(classes, numberOfClasses); 
for (int i = 0; i < numberOfClasses; i++) { 
    Class class = classes[i]; 
    //do something with it 
}