nil であるオブジェクトをスキップして、いくつかのオブジェクト (2 ~ 10) を配列に追加するメソッドが必要です。
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObjectsSkipNils:obj1, obj2, obj3];
このメソッドをエレガントな方法で書くにはどうすればよいですか?
nil であるオブジェクトをスキップして、いくつかのオブジェクト (2 ~ 10) を配列に追加するメソッドが必要です。
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObjectsSkipNils:obj1, obj2, obj3];
このメソッドをエレガントな方法で書くにはどうすればよいですか?
このカテゴリ メソッドは機能します。
@interface NSMutableArray (MyAdditions)
- (void)addObjectsSkipNilsWithCount:(NSUInteger)count objects:(id)obj, ...;
@end
@implementation NSMutableArray (MyAdditions)
- (void)addObjectsSkipNilsWithCount:(NSUInteger)count objects:(id)obj, ...
{
va_list ap;
va_start(ap, obj);
// First object:
if (obj != nil)
[self addObject:obj];
// Remaining objects:
for (NSUInteger i = 1; i < count; i++) {
id myobj = va_arg(ap, id);
if (myobj != nil)
[self addObject:myobj];
}
va_end(ap);
}
@end
例:
NSMutableArray *a = [NSMutableArray array];
[a addObjectsSkipNilsWithCount:3 objects:@"foo", nil, @"bar"];
NSLog(@"%@", a);
// Output: ( foo, bar )
nil
は可変引数リストのターミネータとして使用できないため、オブジェクトの数を明示的に指定する必要があります。(実際に提供されたオブジェクトの数よりもカウントが大きい場合、悪いことが起こる可能性があります!)
以下を使用できます。
[yourMainArray removeObjectIdenticalTo:[NSNull null]];
これをコピーしたい場合arr
は、非常に簡単に行うことができます。