Objective-C
NSLog
NSString
64bit
32bit

32bit と 64bit の差を意識せずに書式文字列で数値を扱うシンプルな方法

More than 1 year has passed since last update.

目的

NSLogNSStringstringWithFormat: で数値を文字列化するときに、32bit 環境と 64bit 環境とでサイズが異なるために、ビルドターゲットによって警告が表示されたりされなかったりします。

それを回避するのに "%zd""%tu" という書式を使って対応する方法がありますが、数値を単純に表示したいだけなら NSNumber にラップすると簡単です。

NSNumber でラップして文字列に変換する

Objective-C では @10 という表記で 10 という値を NSNumber にラップできますが、同じようにして変数も NSNumber にラップ (正式には Boxing と言うらしい) できます。

NSNumber は書式 %@ に渡すと文字列として置き換えられます。

NSInteger integerValue = -1;
NSUInteger uintegerValue = 2;
CGFloat floatValue = 3.5;
double doubleValue = 4.5;

NSLog(@"NSInteger = %@", @(integerValue));
NSLog(@"NSUInteger = %@", @(uintegerValue));
NSLog(@"CGFloat = %@", @(floatValue));
NSLog(@"double = %@", @(doubleValue));

このようにすることで、NSNumber にラップされるときに bit 環境の違いが中和されるため、警告に煩わされることなく数値を文字列に変換できます。

サンプルの実行結果

このときの実行結果は次の通りです。

NSInteger = -1
NSUInteger = 2
CGFloat = 3.5
double = 4.5