NSStringのformat指定
NSStringおよびNSLogのフォーマットには、IEEE準拠のposition指定を使うことができます。
クラスリファレンスをよく読んでみると、さらっと書いてあります。大事なことなのに。
Note that you can also use the “n$” positional specifiers such as %1$@ %2$s. For more details, see the IEEE printf specification.
今までもこの機能を多言語対応で使っていたのですが、今日新たな発見を二つしました。
- 同じポジションを複数回使用できる
- ポジション指定をしない引数があっても良い
もしかしたら常識なのかもしれませんが、僕的には大きな発見です。
プログラム
NSLog(@"%d %d %d",1,2,3);
NSLog(@"%3$d %1$d %2$d",1,2,3);
NSLog(@"%1$d %2$d %1$d %2$d",1,2,3);
実行結果
1 2 3
3 1 2
1 2 1 2
プログラム中では多めにパラメータを定義しておいて、フォーマット側で使う変数を決めるというテクニックは、多言語対応で大きな威力を発揮しそうです。
カテゴリによるNSString拡張
僕の手元では下記のようなカテゴリを使うことにしました。
@interface NSString (BTKExtention)
+ (id) btkStringWithFormat:(NSString*)format
dict:(NSDictionary*)params;
@end
これを使うと、
Here is variable %1$@!
のように書いていたフォーマットを
Here is variable %argname$@!
のように書けます。超快適。
やっつけで書いてしまったので実装は非公開で。。。
もしこの記事のストックが100件になったら実装も整理して公開します:-p