sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

Objective-Cフレーズブック 第5章

Objective‐Cフレーズブック―使いこなすためのコード&イディオム100+

Objective‐Cフレーズブック―使いこなすためのコード&イディオム100+

前回の続き

第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クラス。強力なトークナイザー

なんだか読んでて楽しくなってきました。このまま読み進めることにします。

次回へ続く