web-dev-qa-db-ja.com

NSMutableArrayからのオブジェクトの削除

Forループを設定する際に次のショートカットを見つけました(これまで使用していた教科書の例と比較したショートカット)。

for (Item *i in items){ ... }

長いフォーマットとは対照的に:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right

短いバージョンを使用している場合、現在繰り返されているアイテム(つまり、「i」)を削除する方法はありますか?または、より長い形式を使用する必要がありますか?

16
Ben Packard

fast-enumerating it:の間は、配列からオブジェクトを削除できません。

列挙は「安全」です。列挙子にはミューテーションガードがあるため、列挙中にコレクションを変更しようとすると、例外が発生します。

とにかく、なぜそれを列挙しながらコンテナを変更する必要があるのですか?削除する必要のある要素を保存し、removeObjectsInArray:またはremoveObjectsAtIndexes:メソッドを使用してコンテナーから削除することを検討してください。

31
Vladimir

アイテムを削除した後、キーワードbreak;を追加するだけです...

for(id item in items) {
    if([item isEqual:itemToDelete]) {
        [items removeObject:item];
        break;
    }
}
10
RaiderF

列挙中にObjective-Cコレクションを変更しないでください。

このバリアントを使用して、コレクションからオブジェクトを削除できます。

for (NSInteger i = items.count - 1; i >= 0 ; i--) {
   [items removeObjectAtIndex:i];
}
5
serhii

前者のループは、ObjectiveCの「for-each」ループです。

* iは、items-Array内の直接アイテムへのポインターです(ほとんどの場合、これはNSMutableArrayになります)。

このようにして、アイテムを直接操作できます。

[items removeObject: i];

これは動作するはずです-私は現在Macで動作しておらず、チェックできません。ただし、Objective-Cがコレクションの反復中にオブジェクトを削除できないようにする可能性があります(これはほとんどの言語で非常に一般的です)。

1
BergmannF

私はこれにこのコードを使用します:

for (NSUInteger i = [items count] - 1; ; i--) {
     [items removeObjectAtIndex:i];
}
0
slava