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"
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