コレクションオブジェクトのnilについて
コレクションオブジェクト NSArray、NSDictionary、NSSet ではnilを格納することができません。nilが終端オブジェクトとして扱われているためだと思いますがエラーにさえなりません。
id k1 = @"k1"; id k2 = @"k2"; id k3 = @"k3"; id o1 = @"o1"; id o2 = @"o2"; id o3 = @"o3"; id oNil = nil; NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys: o1, k1, oNil, k2, o3, k3, nil]; NSLog(@"d1=%@", [d1 description]); NSArray *a1 = [NSArray arrayWithObjects:o1, oNil, o3, nil]; NSLog(@"a1=%@", [a1 description]); NSSet *s1 = [NSSet setWithObjects:o1, oNil, o3, nil]; NSLog(@"s1=%@", [s1 description]);
結果
2011-07-27 06:05:04.216 MRTest[5943:207] d1={ k1 = o1; } 2011-07-27 06:05:04.219 MRTest[5943:207] a1=( o1 ) 2011-07-27 06:05:04.219 MRTest[5943:207] s1={( o1 )}
これらのコレクションオブジェクトに対して、空オブジェクトを格納したい場合は [NSNull null] を使います。
id k1 = @"k1"; id k2 = @"k2"; id k3 = @"k3"; id o1 = @"o1"; id o2 = @"o2"; id o3 = @"o3"; id oNil = nil; id oNull = [NSNull null]; NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys: o1, k1, oNull, k2, o3, k3, nil]; NSLog(@"d1=%@", [d1 description]); NSArray *a1 = [NSArray arrayWithObjects:o1, oNull, o3, nil]; NSLog(@"a1=%@", [a1 description]); NSSet *s1 = [NSSet setWithObjects:o1, oNull, o3, nil]; NSLog(@"s1=%@", [s1 description]);
2011-07-27 06:10:23.453 MRTest[5989:207] d1={ k1 = o1; k2 = "<null>"; k3 = o3; } 2011-07-27 06:10:23.455 MRTest[5989:207] a1=( o1, "<null>", o3 ) 2011-07-27 06:10:23.457 MRTest[5989:207] s1={( o1, o3, <null> )}
尚、[NSNull null] はbool判定する時は YESとなるので注意が必要です。
if ([NSNull null]) { NSLog(@"null is YES"); } else { NSLog(@"null is NO"); }
2011-07-27 06:15:57.671 MRTest[6110:207] null is YES