他のリストを含むリスト

あるリストに他のリストが含まれている(サブセット)ことを検査する場合、例えばJavaだとList#containsAllを使えば良いがObjective-CのリストにあたるNSArray/NSMutableArrayには同様のメソッドは実装されていないようだ。

単一の要素が含まれるか否かを検査するcontainsObjectメソッドはあるので、無ければ作ってしまおう。
こんな時、Objective-Cはモンキーパッチよろしくカテゴリにより既存クラスを拡張できるので、あたかもNSArrayクラスのメソッドにのように実装することができる。

NSArray+ArrayUtil.m
@interface NSArray (ArrayUtil)
-(BOOL)sw_containsAll:(NSArray* ) array;
@end

@implementation NSArray (ArrayUtil)

-(BOOL)sw_containsAll:(NSArray*) array
{
   for (id obj in array)
   {
       if (![self containsObject:obj])
       {
           return false;
       }
   }
   return true;
}
@end

以下、カテゴリとして定義したので、まるでNSArrayのメソッドのように使える。

- (void)testMethodNames
{
   NSArray* subset = [[NSArray alloc] initWithObjects:
                         @"create:"
                       , @"read:"
                       , @"update:"
                       , @"delete:"
                       , nil];
   NSArray* result = [dto methodNames];
   STAssertTrue([result containsAll:subset] , nil);
}

Objective-C 2.0の高速列挙を使用しているが、全てをパースするのは変わらない。もっと効率の良い方法無いかな。