Функция Variadic без нулевого завершения

Я пытаюсь создать метод, подобный следующему:

- (void)setCondition:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

Но так как я плохо разбираюсь в препроцессоре, я столкнулся с проблемой, которую я исправил в следующем фрагменте кода, но я хотел бы знать, не существует ли более чистого способа достичь того, чего я хочу, - остановить после предоставленных аргументов

+ (CRCondition *)conditionWithFormat:(NSString *)format,... {
CRCondition *condition      = [[CRCondition alloc] init];

NSArray *conditionSliced    = [condition sliceFormatOperationFromString:format];

condition->_leftOperand     = [[conditionSliced objectAtIndex:0] retain];
condition->_operator        = [condition operatorFromString:[conditionSliced objectAtIndex:1]];
condition->_rightOperand    = [[conditionSliced objectAtIndex:2] retain];

id eachObject;
va_list argumentList;

va_start(argumentList, format);
while ((eachObject = va_arg(argumentList, id))) {
    if ([condition->_leftOperand isEqualToString:@"%K"]) {

        [condition->_leftOperand release];

        if ([eachObject isKindOfClass:[NSString class]])
            condition->_leftOperand = [eachObject retain];

        else
            condition->_leftOperand = [[eachObject description] retain];
    }

    else if ([condition->_rightOperand isKindOfClass:[NSString class]] &&
             [condition->_rightOperand isEqualToString:@"%@"]) {

        [condition->_rightOperand release];
        condition->_rightOperand = [eachObject retain];
    }

    else
        break;
}
va_end(argumentList);

if (![condition isOperatorValid]) {
    NSException *exception = [NSException exceptionWithName:@"Invalid Condition Operator" 
                                                     reason:@"The operator passed is invalid. Must follow the following regex pattern: ([(=><)|(A-Z)]{1,2})" 
                                                   userInfo:nil];
    [exception raise];
}

return [condition autorelease];

}

Проблема заключается в цикле while, который кружится и проходит мимо предоставленных аргументов (я знаю, почему он предоставляет мне другое значение, аргументы cmd и тому подобное)

Если вам нужно больше объяснений, пожалуйста, добавьте комментарии, чтобы я мог ответить вам.

1 ответ

Обычный подход заключается в том, чтобы сначала проанализировать строку формата и выяснить, сколько аргументов должно следовать за ней на основании этого (обычно для каждой строки формата обычно ровно одно действительное число аргументов). Если количество аргументов не выводится из строки формата, обычно завершается список с нуля (как в arrayWithObjects:...).

Другие вопросы по тегам