1. ホーム
  2. objective-c

[解決済み] NSString stringWithFormatで、引数の位置/インデックスを指定する方法はありますか?

2023-06-11 07:58:29

質問

C#には、文字列の書式指定子で引数のインデックスを指定する構文がありますが、例えば。

string message = string.Format("Hello, {0}. You are {1} years old. How does it feel to be {1}?", name, age);

引数は複数回使用することができ、また、提供された引数は使用しないように省略することができます。 別の質問 は、C/C++のための同じフォーマットについて言及しており、その形式は %[index]$[format] のような形で、例えば %1$i . 私は、NSString を 完全に はこの構文を尊重していません。 引数を省略する を省略したときにうまく動作するからです。以下は期待通りに動作しません(EXC_BAD_ACCESS。 age パラメータをNSObject*として参照しようとするため、EX_BAD_ACCESS)。

int age = 23;
NSString * name = @"Joe";
NSString * message = [NSString stringWithFormat:@"Age: %2$i", name, age];

位置引数は、フォーマットから欠落した引数がない場合にのみ尊重されます(これは奇妙な要求のように思われます)。

NSString * message = [NSString stringWithFormat:@"Age: %2$i; Name: %1$@", name, age];

これらの呼び出しはすべてOS Xで正しく動作します。

printf("Age: %2$i", [name UTF8String], age);
printf("Age: %2$i %1$s", [name UTF8String], age);

Objective-C / CocoaでNSStringを使って実現する方法はないでしょうか?ローカライズの際に役立つと思います。

どのように解決するのですか?

NSStringとCFStringは、並び替え可能な/位置のある引数をサポートしています。

NSString *string = [NSString stringWithFormat: @"Second arg: %2$@, First arg %1$@", @"<1111>", @"<22222>"];
NSLog(@"String = %@", string);

また、以下のドキュメントを参照してください。 Apple を参照してください。文字列リソース