LoginSignup
108
107

More than 5 years have passed since last update.

32bitと64bit、共通で使えるNSLogとかのフォーマット指定子

Last updated at Posted at 2014-05-07

2018/05/14 更新

残念ながら・・・%zdでも、Xcodeでwarningが出るようになってしまいました・・・
現状では、NSIntegerは、%ldを使用し、longでキャストするしか方法が思いつかないですが・・・

何か方法を見つけたら、追記します・・・
(そもそも、次期OSの発表時に全ての32bitデバイスをApple様のサポート対象から外すっていう、予告なのかな・・・


iOSの最新のデバイスは、64ビットになってきているが、
古いデバイスはまだ、32ビットだったりする。

32bitと64bitだと、
NSIntegerの型が変わり(32bitでint型、64bitでlong型)
NSNotFoundも値が変わって、いろいろとめんどくさい。
(キャストで切り捨ててもいいけどもったいない気もする

NSLogとかで一意に吐き出せないかな~と思ってたら、
以下のフォーマット指定子を使うことで煩わしさを回避出来るらしい。

  • NSInteger "%zd"
  • NSUInteger "%tu"
  • 16進数 "%tx"
sample
NSInteger i = 1;
NSLog("Integer : %zd", i);

NSUInteger ui = 2;
NSLog("Unsigned Integer : %tu", ui);

NSLog("Integer : %tx", i);

これで、intとlongをうまく使い分けてくれる・・・と思う。

こんな感じのワーニングに効果があるはず。
Value Conversion Issue
Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'int'

まったく知らんかった(自分だけ?)ので、備忘録に。

追記
新しいフォーマット指定子ではないよ
とご指摘をいただきましたので。
文言を修正(「新しい」を消しただけですが^^;
ご指摘、ありがとうございます。

参考:
http://stackoverflow.com/questions/4405006/nslog-specifier-for-nsinteger

108
107
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
108
107