他のリストを含むリスト
あるリストに他のリストが含まれている(サブセット)ことを検査する場合、例えば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の高速列挙を使用しているが、全てをパースするのは変わらない。もっと効率の良い方法無いかな。