Я пытаюсь создать метод, подобный следующему:
- (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 и т. д.)
Если вам нужно больше объяснений, пожалуйста, добавьте комментарии, чтобы я мог ответить вам.