1

削除メソッドを持つNSMutableArrayのカテゴリがあります。

@interface NSMutableArray(MyCategory)
- (void) deleteItemsMatchingCriteria: (SomeCriteria) theCriteria;
@end

これはどのように実装する必要がありますか?

配列を反復処理するために、私は通常enumerateObjectsUsingBlock:を使用しますが、もちろん、反復の途中で配列から項目を削除することはできません。

一般に配列に対してこれを行う標準的な方法はありますか?削除を行う方法が配列のカテゴリである場合は異なりますか?

4

2 に答える 2

4

それを行う最も簡単な方法は、indexesOfObjectsPassingTest:メソッドを使用することです。

[self removeObjectsAtIndexes:[self indexesOfObjectsPassingTest:
    ^BOOL (id element, NSUInteger i, BOOL *stop) {
        return /* YES if the object needs to be removed */;
    }]
];
于 2012-05-04T21:33:09.853 に答える
4

明らかに、以下のコードで基準を確認すると、オブジェクトを削除する必要があるかどうかを判断するためのロジックが増えます。


-(void)deleteItemsMatchingCriteria:(BOOL)theCriteria{
    NSMutableIndexSet *remove = [[NSMutableIndexSet alloc] init];

    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if(theCriteria){
            [remove addIndex:idx];
        }
    }];

    [self removeObjectsAtIndexes:remove];
}

于 2012-05-04T21:29:16.710 に答える