Функция Variadic без нулевого завершения - PullRequest
1 голос
/ 14 мая 2011

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

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

}

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

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

1 Ответ

1 голос
/ 15 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...