108
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
108
Help us understand the problem. What are the problem?