41

私はグーグルで検索し、変数引数の使い方を知りました。しかし、変数引数を別のメソッドに渡したいです。エラーが発生します。どうやってするか ?

-(void) aMethod:(NSString *) a, ... {
  [self anotherMethod:a]; 
  // i m doing this but getting error. how to pass complete vararg to anotherMethod
}
4

4 に答える 4

54

AFAIK ObjectiveC(CやC ++と同じように)は、直接考えていることを可能にする構文を提供しません。

通常の回避策は、関数の2つのバージョンを作成することです。...を使用して直接呼び出すことができるものと、va_listの形式でパラメーターを渡す他の関数によって呼び出されるもの。

..
[obj aMethod:@ "test this%d parameter"、1337);
[obj anotherMethod:@ "test that%d parameter"、666);
..

-(void)aMethod:(NSString *)a、..。
{{
    va_list ap;
    va_start(ap、a);

    [self anotherMethod:a withParameters:ap];

    va_end(ap);
}

-(void)anotherMethod:(NSString *)a、..。
{{
    va_list ap;
    va_start(ap、a);

    [self anotherMethod:a withParameters:ap];

    va_end(ap);
}

-(void)anotherMethod:(NSString *)a withParameters:(va_list)valist
{{
    NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]);
}
于 2010-03-06T08:31:28.200 に答える
20

可変個引数を直接渡すことはできません。va_listしかし、これらのメソッドのいくつかは、引数を渡すことができる代替手段を提供します。

#include <stdarg.h>

-(void)printFormat:(NSString*)format, ... {
   // Won't work:
   //   NSString* str = [NSString stringWithFormat:format];

   va_list vl;
   va_start(vl, format);
   NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease];
   va_end(vl);

   printf("%s", [str UTF8String]);
}
于 2010-03-06T08:31:59.243 に答える
1

引数を配列または辞書のいずれかに設定し、条件付きでコーディングすることを検討しましたか?

-(void) aMethodWithArguments:(NSArray *)arguments {
    for (id *object in arguments) {
        if ([object isKindOfClass:fooClass]) {
            //handler for objects that are foo
            [self anotherMethod:object];
        }
        if ([object isKindOfClass:barClass]) {
            //and so on...
            [self yetAnotherMethod:object];
        }
    }
}
于 2010-10-29T17:06:18.640 に答える
0

マクロを使って同じことを達成できると思います。aMethodの可変引数を別の引数に渡したいとしましょう

-(void) aMethod:(NSString *) a, ... {
}

実際のメソッドではありませんが、マクロを使用して別の「メソッド」を定義できます。

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]

これが私の解決策です。

于 2017-08-23T08:40:10.220 に答える