3

このようにすることは可能ですか:

- (void) setList:(id) firstObj,...
{
    va_list args;
    va_start(args,firstObj);
    list = [[NSArray alloc] initWithObjects:args]; // Compile error
    va_end(args);
}
4

3 に答える 3

7

これを試して:

- (void) setList:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION
{
    va_list args;
    va_start(args, firstObj);
    list = [[NSMutableArray alloc] initWithObjects:firstObj, nil];
    id obj;
    while ((obj = va_arg(args, id)) != nil) {
        [list addObject:obj];
    }
    va_end(args);
}
于 2012-09-07T13:42:43.350 に答える
5

NSArrayをとるコンストラクターがないva_listため、自分で引数をループして、可変配列に追加する必要があります。また、終了する引数の制約を追加する必要がありnilます。

- (void) setList:(id) firstObj,... __attribute__((sentinel)) //make sure it is nil terminated
{
    //You have to add the first object yourself
    NSMutableArray *tmplist = [NSMutableArray arrayWithObject:firstObj];
    va_list args;
    va_start(args,firstObj);

    id arg; 
    while((arg = va_arg(args, id)) != nil)
        [tmplist addObject:arg];

    va_end(args);

    list = [tmplist copy];
}
于 2012-09-07T13:48:05.823 に答える
2

かなり近い、このようなものがうまくいくはずです。問題は、このための API 関数がないことです。そのため、オブジェクトをリストから取り出して、インスタンス化する配列に追加する必要があります。

-(void *)setList:(id)firstObj, ... {
    //The array you're holding everything in
    arr = [NSMutableArray array];
    [arr addObject:firstObject];

    //Get the variable list
    va_list args;
    va_start(args, action1);

    //Create the object
    id object = va_arg(args, id);

    //Keep adding objects until you run out
    while(object) {
        [arr addObject:object];
        object = va_arg(args, id);
    }

    va_end(args);
}
于 2012-09-07T13:47:07.743 に答える