/ / Как да инициираме NSArray с обекти, преминали по метода с променлив списък с аргументи - цел-c

Как да инициираме NSArray с обекти, преминали по метод с променлив списък с аргументи - цел-c

Възможно ли е да направите това по следния начин:

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

Отговори:

7 за отговор № 1

Опитайте тази:

- (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);
}

5 за отговор № 2

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];
}

2 за отговор № 3

Доста близо, нещо подобно трябва да работи. Проблемът е, че за това няма функция на приложния програмен интерфейс (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);
}