2011年11月12日土曜日

NSNumberとNSValueとCGRect,CGPoint,CGSIzeについて

どうも、俺@家帰っても勉強中です。
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の場合とほとんど一緒です。


以上でぇぇぇぇす。

0 件のコメント: