2015-12-31 3 views
0

В нашей текущей реализации мы хотим изменить наши строковые аргументы (Push-loc-args) и добавить новые аргументы. Но мы хотим, чтобы пользователь наших старых версий продолжал использовать аргумент # 3, а для нового пользователя мы хотим аргумент пользователя # 4. Таким образом, в нашей новой реализации мы следующий код:

NSString *format = @"%[email protected], %[email protected] ,%[email protected]"; 
NSArray *arg = @[@"Argument 1", @"Argument 2",@"Argument 3",@"Argument 4"]; 
NSString *ouptput = [NSString stringWithFormat:format, arg[0], arg[1], arg[2], arg[3]]; 

Выход: Аргумент 2, аргумент 1, аргумент 3

Мы ожидаем, что это будет

Довод 2, Аргумент 1, Аргумент 4

Как мы можем достичь Argument 4 на месте. Любая другая альтернатива stringWithFormat:

Примечания: Apple блокировка экрана толчок уведомление является правильной (Argument 2, Argument 1 ,Argument 4), но stringWithFormat: не обрабатывает его таким образом

+0

"старые версии"? которого? Если это приложение, то как старые версии даже видят изменения? – trojanfoe

+0

Фактически аргументы отправляются через push-уведомления, поэтому, если мы изменим аргументы, приложения «Old Version» получат обновленный список аргументов. В приложении используется только формат. –

+0

См. Http://stackoverflow.com/questions/2944704/advanced-localization-with-omission-of-arguments-in-xcode: * "Когда используются специфицированные аргументы аргумента, указание N-го аргумента ** требует **, чтобы все ведущие аргументы от первого до (N-1) -го, указаны в строке формата. "* - Если вы опустите третий аргумент в строке формата, поведение не определено. –

ответ

0

Я реализован специальный метод для достижения ожидаемого выхода. Этот метод может обрабатывать отсутствующий спецификатор местоположения. Этот метод будет работать только для формата, содержащего позиционный спецификатор %[email protected].

/** 
@param format String format with positional specifier 
@param arg Array of arguments to replace positional specifier in format 
@return Formatted output string 
*/ 
+(NSString*)stringWithPositionalSpecifierFormat:(NSString*)format arguments:(NSArray*)arg 
{ 
    static NSString *pattern = @"%\\d\\[email protected]"; 

    NSError *error; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSMutableString *mString = [[NSMutableString alloc] initWithString:format]; 
    NSArray *allMatches = [regex matchesInString:format options:0 range:NSMakeRange(0, [format length])]; 
    if (!error && allMatches>0) 
    { 
     for (NSTextCheckingResult *aMatch in allMatches) 
     { 
      NSRange matchRange = [aMatch range]; 
      NSString *argPlaceholder = [format substringWithRange:matchRange]; 
      NSMutableString *position = [argPlaceholder mutableCopy]; 
      [position replaceOccurrencesOfString:@"%" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [position length])]; 
      [position replaceOccurrencesOfString:@"[email protected]" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [position length])]; 
      int index = position.intValue; 
      //Replace with argument 
      [mString replaceOccurrencesOfString:argPlaceholder withString:arg[index-1] options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mString length])]; 
     } 
    } 
    return mString; 
}