実際、NSArray から va_list を作成するのは難しくありません。この件に関するMatt Gallagher の優れた記事を参照してください。
あなたが望むことを行うための NSString カテゴリは次のとおりです。
@interface NSString (NSArrayFormatExtension)
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments;
@end
@implementation NSString (NSArrayFormatExtension)
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments
{
char *argList = (char *)malloc(sizeof(NSString *) * arguments.count);
[arguments getObjects:(id *)argList];
NSString* result = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease];
free(argList);
return result;
}
@end
それで:
NSString* s = [NSString stringWithFormat:@"xxx=%@, yyy=%@" array:@[@"XXX", @"YYY"]];
NSLog( @"%@", s );
残念ながら、64 ビットでは va_list の形式が変更されたため、上記のコードは機能しなくなりました。また、明らかに変更される可能性がある形式に依存するため、とにかく使用するべきではありません。va_list を作成する確実な方法がない場合、より良い解決策は、単純に引数の数を適切な最大数 (たとえば 10) に制限してから、次のように最初の 10 個の引数で stringWithFormat を呼び出すことです。
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments
{
if ( arguments.count > 10 ) {
@throw [NSException exceptionWithName:NSRangeException reason:@"Maximum of 10 arguments allowed" userInfo:@{@"collection": arguments}];
}
NSArray* a = [arguments arrayByAddingObjectsFromArray:@[@"X",@"X",@"X",@"X",@"X",@"X",@"X",@"X",@"X",@"X"]];
return [NSString stringWithFormat:format, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9] ];
}