Objective-CでNSNumberとNSValueという不思議なクラスにぶち当たりました。
NSNumberは数値を表すオブジェクト型で、プリミティブなintやNSIntegerとは少し意味合いが違います。
つまりintとNSIntegerはイコールですが、NSNumberはイコールではありません。
使い方は
int i = 10; NSInteger i = 10; NSNumber *i = 10;のようになります。
使いどころですが、例えばオブジェクト型で数値を表現したい場合はNSNumberを、そうでない場合はintやNSIntegerを使いましょう!というそのままなのですが、
具体的には、NSArrayなどに格納できる要素はオブジェクト型である必要があります。
NSArrayやNSMutableArrayにどうしても数値を格納する必要があれば、NSNumberを使えばOKです。
int i =10; NSNumber *num = [NSNumber numberWithInt: i];としてやればintをNSNumber型に変換できます。
他にも
NSNumber *num = [NSNumber numberWithFloat: 10.0f];のような使い方もできます。
逆にNSNumber型をint型として取り出すには
int i = [num intValue];でOKです。
またNSValueですが、これはCGRectやCGPoint、CGSizeなど構造体を表すオブジェクト(NSObjectを継承していない)を扱う場合に利用します。
CGRectとかCGPointなどはクラスの引数の型などに設定できないんですね。あとは上の例のように、NSArrayの要素として追加したい場合など。
CGrect rect = CGRectMake(0, 0, 100, 100); NSValue *val = [NSValue valueWIthCGRect:rct]; CGPoint point = CGPointMake(100, 100); NSValue *val = [NSValue valueWIthCGPoint:point]; CGSize size = CGSizeMake(100, 100); NSValue *val = [NSValue valueWIthCGSIze:size];こんな感じです。
逆にNSValue型のオブジェクトからCGRectなどを取り出す場合は
CGRect rect = [val CGRectValue]; CGPoint point = [val CGPointValue]; CGSize size = [val CGSizeValue];使い方はNSNumberの場合とほとんど一緒です。
以上でぇぇぇぇす。