Foundation(数値)
2010. 04. 09
サンプルコードを載せているのはいいんですが、実行結果が載っていないので正しいのかどうかも判断つかない上に、存在しないメソッドが書かれてたりと難儀している今日この頃です。
●数値のクラス図
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではnumberWithChar:の引数が『'c'』と『''』で囲むところ、『c』になっていました。
・numberWithInt:
+ (NSNumber *)numberWithInt:(int)value
指定したint値(符号有り整数)のNSNumberオブジェクトを作成し、返します
value:int値を指定します
・numberWithFloat:
+ (NSNumber *)numberWithFloat:(float)value
指定したfloat値(浮動小数点実数)のNSNumberオブジェクトを作成し、返します
value:float値を指定します
・numberWithBool:
+ (NSNumber *)numberWithBool:(BOOL)value
指定したBOOL値のNSNumberオブジェクトを作成し、返します
value:BOOL値を指定します
・numberWithChar:
+ (NSNumber *)numberWithChar:(char)value
指定したchar値(符号有り文字)のNSNumberオブジェクトを作成し、返します
value:char値を指定します
・intValue
- (int)intValue
レシーバのNSNumberオブジェクトをint値にして返します
・floatValue
- (float)floatValue
レシーバのNSNumberオブジェクトをfloat値にして返します
・boolValue
- (BOOL)boolValue
レシーバのNSNumberオブジェクトをBOOL値にして返します
・charValue
- (char)charValue
レシーバのNSNumberオブジェクトをchar値にして返します
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではvalueWithRange:で作るオブジェクト名が『rangeValue』でした。
コンパイルで警告が出るわけではありませんが、同名のメソッドがあるのでそのような命名は控えた方がいいと思います。
・valueWithRange:
+ (NSValue *)valueWithRange:(NSRange)range
指定したNSRange構造体のNSValueオブジェクトを作成し、返します
range:NSRange構造体の範囲を指定します
・rangeValue
- (NSRange)rangeValue
レシーバのNSValueオブジェクトをNSRange構造体にして返します
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではnullオブジェクトの追加を『appendObject:』というメソッドで行っていますが、正しくは『addObject:』です。
・array
+ (id)array
空の配列を作成し、返します
このメソッドはNSArrayの可変サブクラスであるNSMutableArrayクラスで使用されます
・addObject:
- (void)addObject:(id)anObject
レシーバの配列の最後に指定したオブジェクトを挿入します
anObject:レシーバの配列の最後に追加するオブジェクトを指定します
この値はnilを指定できません
nilを指定した場合は、NSInvalidArgumentExceptionが呼び出されます
・count
- (NSUInteger)count
レシーバの配列の要素数を返します
※ nilとNSNullの違い(注:初心者が調べたことなので間違っているかもしれません)
addObject:メソッドで、『nilを指定できない』ので『NSNull(のインスタンス)』を指定しています。
今まで漠然と『空を意味するもの』として、両者の区別を意識していませんでした。
『詳解 Objective-C 2.0』によると、nilは『id型の空ポインタで値は0』で、『存在しないオブジェクトを指すポインタ』と書いてあります。
id型のポインタなので、インスタンス生成時にポインタの初期化で用いられるのですが、配列(NSArray)や辞書(NSDictionary)の初期化で使う事は禁止されています。
(インデックスやキーと値のペアなど、順序立てしてないとダメだから?)
そこで『何も無い』ということを示すポインタを用意するのがNSNullクラスのnullメソッドです。
・null
+ (NSNull *)null
NSNullクラスのシングルトンインスタンスを返します
シングルトンとはインスタンスを一つしか作らないクラスのことで、NSNullのインスタンスは何処で何回呼ばれても同じものになります。
要は『配列と辞書で空要素を入れたい時は、nilじゃなくて『NSNull null』を使う』ということなのですが、『じゃあ、全部nilじゃなくて『NSNull null』にすれば?』と普通に疑問に思いつつ、調べても理解できなかったので追々ということで・・・
nilを調べていたら『OKLab/Objective-C入門』で、nilとNilは別物だと知りました。
違いがよく分かりませんけど・・・
(救いを求めて、ぐぐって迷い込んで来られた方へ。こんな内容で申し訳有りません)
参考文献
・NSNumber Class Reference
・NSValue Class Reference
・NSArray Class Reference
・NSMutableArray Class Reference
・NSNull Class Reference
●数値のクラス図
Foundation | Core Foundation | ||||
NSDecimalNumberHandler | - | ||||
NSNull | CFNull | ||||
NSValue | NSNumber | NSDecimalNumber | - | CFNumber | - |
NSValueTransformer | - |
// 整数値オブジェクトの作成
NSNumber *intNumber = [NSNumber numberWithInt:72];
// 小数値オブジェクトの作成
NSNumber *floatNumber = [NSNumber numberWithFloat:9393.0f];
// 論理値オブジェクトの作成
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
// 文字オブジェクトの作成
NSNumber *charNumber = [NSNumber numberWithChar:'A'];
// オブジェクトの出力
NSLog([NSString stringWithFormat:@"int = %d, float = %f, bool = %d, char = %c", [intNumber intValue], [floatNumber floatValue], [boolNumber boolValue], [charNumber charValue]]);
// int = 72, float = 9393.000000, bool = 1, char = A
NSNumber *intNumber = [NSNumber numberWithInt:72];
// 小数値オブジェクトの作成
NSNumber *floatNumber = [NSNumber numberWithFloat:9393.0f];
// 論理値オブジェクトの作成
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
// 文字オブジェクトの作成
NSNumber *charNumber = [NSNumber numberWithChar:'A'];
// オブジェクトの出力
NSLog([NSString stringWithFormat:@"int = %d, float = %f, bool = %d, char = %c", [intNumber intValue], [floatNumber floatValue], [boolNumber boolValue], [charNumber charValue]]);
// int = 72, float = 9393.000000, bool = 1, char = A
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではnumberWithChar:の引数が『'c'』と『''』で囲むところ、『c』になっていました。
・numberWithInt:
+ (NSNumber *)numberWithInt:(int)value
指定したint値(符号有り整数)のNSNumberオブジェクトを作成し、返します
value:int値を指定します
・numberWithFloat:
+ (NSNumber *)numberWithFloat:(float)value
指定したfloat値(浮動小数点実数)のNSNumberオブジェクトを作成し、返します
value:float値を指定します
・numberWithBool:
+ (NSNumber *)numberWithBool:(BOOL)value
指定したBOOL値のNSNumberオブジェクトを作成し、返します
value:BOOL値を指定します
・numberWithChar:
+ (NSNumber *)numberWithChar:(char)value
指定したchar値(符号有り文字)のNSNumberオブジェクトを作成し、返します
value:char値を指定します
・intValue
- (int)intValue
レシーバのNSNumberオブジェクトをint値にして返します
・floatValue
- (float)floatValue
レシーバのNSNumberオブジェクトをfloat値にして返します
・boolValue
- (BOOL)boolValue
レシーバのNSNumberオブジェクトをBOOL値にして返します
・charValue
- (char)charValue
レシーバのNSNumberオブジェクトをchar値にして返します
// 範囲を表すオブジェクトを作成
NSValue *rngValue = [NSValue valueWithRange:NSMakeRange(72, 91)];
// 前後の空白文字を削除
NSLog([NSString stringWithFormat:@"Location = %d, Length = %d", [rngValue rangeValue].location, [rngValue rangeValue].length]);
NSValue *rngValue = [NSValue valueWithRange:NSMakeRange(72, 91)];
// 前後の空白文字を削除
NSLog([NSString stringWithFormat:@"Location = %d, Length = %d", [rngValue rangeValue].location, [rngValue rangeValue].length]);
// Location = 72, Length = 91
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではvalueWithRange:で作るオブジェクト名が『rangeValue』でした。
コンパイルで警告が出るわけではありませんが、同名のメソッドがあるのでそのような命名は控えた方がいいと思います。
・valueWithRange:
+ (NSValue *)valueWithRange:(NSRange)range
指定したNSRange構造体のNSValueオブジェクトを作成し、返します
range:NSRange構造体の範囲を指定します
・rangeValue
- (NSRange)rangeValue
レシーバのNSValueオブジェクトをNSRange構造体にして返します
// 空の配列を作成し、NULLで初期化します
NSMutableArray *nullArray = [NSMutableArray array];
[nullArray addObject:[NSNull null]];
[nullArray addObject:[NSNull null]];
// 配列の要素数と中身を出力します
NSLog([NSString stringWithFormat:@"Count = %d, [0] = %@", [nullArray count], [nullArray objectAtIndex:0]]);
// Count = 2, [0] = <null>
NSMutableArray *nullArray = [NSMutableArray array];
[nullArray addObject:[NSNull null]];
[nullArray addObject:[NSNull null]];
// 配列の要素数と中身を出力します
NSLog([NSString stringWithFormat:@"Count = %d, [0] = %@", [nullArray count], [nullArray objectAtIndex:0]]);
// Count = 2, [0] = <null>
新版の『iPhone SDK 3 プログラミング大全』では修正されているのかもしれませんが、手元の旧版(第1版第2刷)ではnullオブジェクトの追加を『appendObject:』というメソッドで行っていますが、正しくは『addObject:』です。
・array
+ (id)array
空の配列を作成し、返します
このメソッドはNSArrayの可変サブクラスであるNSMutableArrayクラスで使用されます
・addObject:
- (void)addObject:(id)anObject
レシーバの配列の最後に指定したオブジェクトを挿入します
anObject:レシーバの配列の最後に追加するオブジェクトを指定します
この値はnilを指定できません
nilを指定した場合は、NSInvalidArgumentExceptionが呼び出されます
・count
- (NSUInteger)count
レシーバの配列の要素数を返します
※ nilとNSNullの違い(注:初心者が調べたことなので間違っているかもしれません)
addObject:メソッドで、『nilを指定できない』ので『NSNull(のインスタンス)』を指定しています。
今まで漠然と『空を意味するもの』として、両者の区別を意識していませんでした。
『詳解 Objective-C 2.0』によると、nilは『id型の空ポインタで値は0』で、『存在しないオブジェクトを指すポインタ』と書いてあります。
id型のポインタなので、インスタンス生成時にポインタの初期化で用いられるのですが、配列(NSArray)や辞書(NSDictionary)の初期化で使う事は禁止されています。
(インデックスやキーと値のペアなど、順序立てしてないとダメだから?)
そこで『何も無い』ということを示すポインタを用意するのがNSNullクラスのnullメソッドです。
・null
+ (NSNull *)null
NSNullクラスのシングルトンインスタンスを返します
シングルトンとはインスタンスを一つしか作らないクラスのことで、NSNullのインスタンスは何処で何回呼ばれても同じものになります。
要は『配列と辞書で空要素を入れたい時は、nilじゃなくて『NSNull null』を使う』ということなのですが、『じゃあ、全部nilじゃなくて『NSNull null』にすれば?』と普通に疑問に思いつつ、調べても理解できなかったので追々ということで・・・
nilを調べていたら『OKLab/Objective-C入門』で、nilとNilは別物だと知りました。
違いがよく分かりませんけど・・・
(救いを求めて、ぐぐって迷い込んで来られた方へ。こんな内容で申し訳有りません)
参考文献
・NSNumber Class Reference
・NSValue Class Reference
・NSArray Class Reference
・NSMutableArray Class Reference
・NSNull Class Reference
![]() | iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books) (2009/09/08) 木下 誠 商品詳細を見る |
![]() | 詳解 Objective-C 2.0 第3版 (2011/12/28) 荻原 剛志 商品詳細を見る |
![]() | Dynamic Objective-C (2009/03/27) 木下 誠 商品詳細を見る |