stringWithFormat中的多个参数:“n $”位置说明符

在我们当前的实现中,我们想要改变我们的string参数(Push notification loc-args)并添加新的参数。 但是,我们希望旧版本的用户仍然使用参数#3,对于新用户,我们想要用户参数#4。 所以在我们的新实现中,我们有以下代码:

NSString *format = @"%2$@, %1$@ ,%4$@"; 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 4stringWithFormat:任何其他替代stringWithFormat:

注意:苹果锁屏推送通知是正确的( Argument 2, Argument 1 ,Argument 4 ),但stringWithFormat:不处理它的方式

我实现了一个自定义方法来实现预期的输出。 这个方法可以处理缺less的位置说明符。 此方法仅适用于包含位置说明符%n$@格式。

 /** @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\\$@"; 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:@"$@" 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; }