Objective-Cフレーズブック 第5章
Objective‐Cフレーズブック―使いこなすためのコード&イディオム100+
- 作者: デイビッドチズナール,David Chisnall,パセイジ
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/12
- メディア: 単行本
- この商品を含むブログ (1件) を見る
前回の続き
第5章 数値
- ObjCはchar,short,int,long,long long,float,doubleとCのプリミティブな型を全て継承しており、全ての型昇格ルールがCと同様に動作する
- Cではintのサイズが固定されていない。OS Xでは、ILP32(int,long,ポインタが32bit)とLP64(long,ポインタが64bit)モードがサポートされている。WinはLL64(int, longが32bitで、long longが64bit)で、Win64の場合ポインタをlongにキャストすると問題が発生する
- C99ではポインタと同じサイズである intptr_t のtypedefが導入されたが、Appleはこれに相当するNSInteger/NSUIntegerを導入
- CGFloat/NSFloatはサイズがポインタと同じで、32bit platformではfloat, 64bitではdoubleになる
コレクションへの数値の格納
- ObjCコレクションクラスにプリミティブ型を格納したい時は、プリミティブをラップするNSValueを使う
- NSValueはクラスクラスターの一例で、NSValueにインスタンスを作成するよう要求すると、実際にはその値に適したサブクラスのインスタンスが返される
- NSValue/NSNumberの指定コンストラクターは+valueWithBytes:objCtype:だが、最初の引数は値へのポインタ、次の引数は型エンコーディングで、@encode()ディレクティブで取得する
型エンコーディングは、typeofと組み合わせて使うと便利
int primValue; NSValue* value = [NSValue valueWithBytes:&primValue objCType: @encode(typeof(primValue))];
- NSNumberのインスタンスは順序付けられているため、コレクションのソートが可能
10進演算
- 10進数値を10進数のまま保持するのがNSDecimal構造体。NSValueのサブクラスには、NSDecimalNumberオブジェクトもある
- 10進数の算術には、NSDecimalNumberのインスタンスメソッドを使う方法と、NSDecimalを操作するCのAPIを使う方法の2種類がある
文字列と数値の変換
- 文字列から数値への変換は、NSStringに用意されている、-intValueや-doubleValue等のメソッドを使うのが便利
- 数値から文字列は、NSStringの+stringWithFormatが簡単。ロケールを指定するなら-initWithFormat:Locale:。NSSnumberがあるなら、-descriptionWithLocale:か-stringValue
文字列からの数値の読み取り
- ObjCで、Cのsscanf()に相当するものはNSScannerクラス。強力なトークナイザー
なんだか読んでて楽しくなってきました。このまま読み進めることにします。
次回へ続く