Objective-Cでのテキストフォーマット引数あれこれ

先日のiPhoneアプリ開発勉強会にて、MonoTouchでの発表の中に

テキストフォーマッティング

という説明がありました。*1


これは、テキストに引数を埋め込む際に、引数の順番を任意にできるというもの…
発表スライドではこのような例が。

int all = 10;
int count = 3;

String.Format("{0}回中の{1}回", all, count);
String.Format("{1} times in {0}", all, count);

文章表現の内容によっては、日本語と英語で順番が変わる場合があるので、これができるとローカライズ処理がとっても便利になるのです…!


いいなぁ…Objective-Cにも欲しかったよ…こんな機能…



あったwww

Objective-Cにもありましたわw
[iPhone] Localized 時の小技 | Sun Limited Mt.

n$(nは整数)で解決!


サンプルです。

NSString *str1 = @"お";
NSString *str2 = @"お";
NSString *str3 = @"た";
NSString *str4 = @"け";
NSString *str5 = @"し";
NSString *str6 = @"の";
NSString *str7 = @"ぶ";

NSLog(@"%1$@ %2$@ %3$@ %4$@ %5$@ %6$@ %7$@", str1, str2, str3, str4, str5, str6, str7);
NSLog(@"%7$@ %3$@ %6$@ %4$@ %1$@ %2$@ %5$@", str1, str2, str3, str4, str5, str6, str7);


それぞれ
お お た け し の ぶ
ぶ た の け お お し
と表示されます。


また、引数は複数回指定することも可能で

NSLog(@"%5@ %1$@ %7$@ %3$@ %6$@ %4$@ %1$@ %2$@ %5$@", str1, str2, str3, str4, str5, str6, str7);

とすると
し お ぶ た の け お お し
と表示されます。


これでObjective-Cでのローカライズ処理も安心ですね!



…えっ?

とスンナリいかないのがiPhoneアプリ開発…。
今回もありました…とはいえ些細なことですけども。


例えば

NSLog(@"%7$@ %3$@ %6$@ %4$@ %1$@ %2$@", str1, str2, str3, str4, str5, str6, str7);

とすると、表示して欲しい結果は
ぶ た の け お お
なのですが、私の開発環境では
の た し け お お
という謎の結果に…


これは、テキストフォーマット時に使用しない引数があると起こるようです。
上記だとstr5を使用していませんね。


気をつけましょう…引数は使い切る!ということで。

*1:hIDDEN bLOG » iPhoneアプリ開発勉強会 2010/9/3 in 福井高専に表示されているスライド37ページ目にあります。