yashiganiの英傑になるまで死ねない日記

週末はマスターバイクでハイラルを走り回ります

最近はやってるNSLogの書き方

2014年のご時世になっても,やはりprintfデバッグはそのお手軽さとあいまってよく使われる. Objective-Cでの開発でもそれは御多分に洩れずそんな感じで,NSLogを埋め込んで変数の様子をコンソールに出力する. viewのheightなどを表示したいとき,

CGFloat height = CGRectGetHeight(view.frame);
NSLog(@"height = %f", height);

なんてNSLogを書く. しかし,iOSの世界にもiPhone 5s が登場し,64bit環境が追加されてから,これが通用しなくなった. (OS XSnow Leopardから64bit環境になってるからもうちょっと前からだけど) なぜなら,

CGFloat 
The basic type for all floating-point values.
 
typedef float CGFloat;     // 32-bit 
typedef double CGFloat;    // 64-bit

そう,動作環境によってCGFloatNSIntegerの精度が変わるので,フォーマットの書式を使いわけないと警告が出たり思わぬバグを仕込んでしまったりする. イチイチ使い分けるのもめんどうなので最近はこういう風に書いてる.

CGFloat height = CGRectGetHeight(view.frame);
NSLog(@"height = %@", @(height));

ただNSNumberリテラルを使ってるだけだけど,スカラの型がなんだろうが使える. フォーマットなんだったっけ?ってイチイチGoogle先生にお伺いをたてる必要もなくなるので地味に便利.

余談

当然だけど,キャストの変わりにも使える.

NSInteger foo = ...
NSUInteger bar = ...
NSInteger baz = @(foo).integerValue + @(bar).integerValue;