これはあなたの質問に対する直接的な回答ではありませんが、より広い意味での回答です。
Objective-C の哲学は、メッセージを送信し、それをどう処理するかをオブジェクトに決定させるという Smalltalk の哲学に似ています。オブジェクトがどのクラスであるかを確認するために多くのテストを行う必要がある場合は、設計を再考する必要があります。
たとえば、オブジェクトの配列があり、それぞれを整数に変換して計算を行いたい場合は、次のようにすることができます。
for (id anObj in array)
{
int anInt = [anObj intValue];
// do something with anInt
}
それぞれのクラスが何であるかは関係ありません。anObj
送信できます-intValue
。たとえば、配列が と でいっぱいであるNSStrings
場合NSNumbers
、それは問題ではありません。上記のコードは、期待どおりに動作します。
多くのクラスは、セレクターのメソッドを定義していません-intValue
。たとえば、そのメッセージをそのインスタンスに送信するとNSData
、例外がスローされて応答します。状況に応じて、これを解決する方法がいくつかあります。
オブジェクトがセレクターを認識しているかどうかをテストして、セレクターに応答しないオブジェクトを無視する
for (id anObj in array)
{
if ([anObject respondsToSelector: @selector(intValue)])
{
int anInt = [anObj intValue];
// do something with anInt
}
}
配列に配置されることがわかっているすべてのクラスのセレクターを定義します。これは、カテゴリを宣言することによって行われます。このようにして、サブクラス化せずに任意の Objective-C クラスを拡張できます。たとえば、長さ、バイトの合計、またはその他の適切な値を返す NSData の intValue メソッドを定義できます。
protocolを宣言して、要件を形式化します。次に、プロトコルへの準拠をテストするか、コンパイル時のチェックに依存して、配列に配置したオブジェクトがプロトコルに準拠していることを確認できます。
できることはたくさんありますが、クラス階層の C++/Java モデルから少し離れる必要があります。その点で、Objective-C ははるかに柔軟です。