0

C++ から来て、初めて Objective C でプログラミングしています (これまでのところ、後者の方がずっと好きです!)。可変配列に関して質問があります。つまり、ジェネリック ID タイプではなく、オブジェクトの 1 つである「CMParticle」の特定のタイプで配列を作成したいと考えています。可変配列からオブジェクトのデータにアクセスするには、毎回オブジェクトの 1 つとしてキャストする必要があります (これは面倒だと思います)。

rij[0] = ((CMParticle *)particles[*pi]).crds[0] - ((CMParticle *)particles[*pj]).crds[0];

ここで、「粒子」は CMParticle オブジェクトの変更可能な配列です。私はむしろこれをしたいです

rij[0] = particles[*pi].crds[0] - particles[*pj].crds[0];

これに先立って、可変配列を次のように宣言します。

particles = [NSMutableArray array];

毎回型キャストする必要がないように、何らかの形でこの配列を自分の型で宣言できればいいのですが。これを行う方法はありますか?

4

1 に答える 1

1

あなたがやろうとしていることは、Objective C では実際には意味がありません。

C++ コンテナーは同種ですが、汎用的です。vector<CMParticle>、またはを持つことができvector<int>、それらは異なるタイプです。

ObjC コンテナーは異種です。を持っているだけで、オブジェクト、オブジェクト、またはその他のものをすべて 1 つの大きな配列に混在さNSArrayせることができます。CMParticleNSNumber

通常、これらのキャストはまったく必要ありません。にメッセージを送信したい場合はmy_array[3]、そのまま実行してください[my_array[3] doSomething:15]。高水準言語 (Python、Ruby、Smalltalk、Javascript など) のように。

唯一の問題は、(Python などとは異なり)キャストが必要な場合がいくつかあることです。最も重要な (そして厄介なことに) メンバーに直接アクセスしたい場合は、最初にキャストする必要があります。これが、(Python などとは異なり) ObjC が@propertyメンバーに直接アクセスする代わりに明示的なアクセサーを使用することを推奨する理由の 1 つです。(また、より小さな煩わしさとして、変数には型が宣言されているため、 と書くだけではなくtempval = my_array[3];、 のように型を指定する必要がありますCMParticle *tempval = my_array[3]。)

別の見方をすると、C++ は C の静的で弱い型システムを拡張して、より強力な静的型システムを提供します。代わりに、ObjC は別個の動的型システムに追加されます (残念ながら、既存の C のものは変更されずに残されているため、時折問題が発生します)。

NSMutableArrayジェネリック (もちろん、C++ のコンパイル時とは異なり、実行時にクラスを取得します) で同種の独自のサブクラスを非常に簡単に作成できますが、制限を追加するだけです。要素はまだidどこにでもあります。これを回避する唯一の方法は、配列ごとにカスタム クラスを作成することMutableCMParticleArrayです: 、MutableNSNumberArrayなど。

于 2013-04-22T21:47:34.963 に答える