コレクションオブジェクトの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