3

私はObjectiveCに非常に慣れていないので、自分がやりたいことが可能かどうか/どのようにできるかを知りたいです。いくつかのクラスがあります

    @interface A: NSObject
{
    NSString*  Aa;
    NSUInteger Ab;
}

    @interface B: A
{
    NSString*  Ba;
    NSUInteger Bb;
}

    @interface C: A
{
    NSString*  Ca;
    NSUInteger Cb;
}

'A'タイプのオブジェクトを期待する関数を作成し、実装でそれらのタイプが後でBまたはCかどうかを確認したいと思います。これが私が欲しいものです:

-(void)doSomething:(A *param)
{
    //do some stuff
    if(param is an instance of B)
    {
        //do stuff with B
    }
    else
    {
        //do stuff with C
    }
}

どのようにそれを行うことができますか?

心から、

ゾリ

4

2 に答える 2

6

使用する可能性のある4つの方法があります。

  • isKindOfClass:オブジェクトがクラスまたはサブクラスのメンバーであるかどうかをテストします
  • isMemberOfClass:上記と同じですが、より具体的には、サブクラスを許可しません
  • respondsToSelector:オブジェクトがのような特定のセレクターに応答するかどうかをテストします[param respondsToSelector:@selector(method:)]。ダックタイピングに便利です。
  • conformsToProtocol:オブジェクトがプロトコルを実装しているかどうかをテストします。
于 2012-06-01T08:05:54.937 に答える
6

NSObjectのメソッドisKindOfClass:(Class)cを確認します。これを行うには、次のようにします。

-(void)doSomething:(A *)param
{
    //do some stuff
    if([param isKindOfClass:[B class]])
    {
        //do stuff with B (cast will be required to avoid warnings!)
        B *castedB = (B *)param;
        //...
    }
    else if ([param isKindOfClass:[C class]])
    {
        //do stuff with C
        C *castedC = (C *)param;
        //...
    }
}

この助けを願っています!

于 2012-06-01T08:00:07.963 に答える