どうも。
ちょっと考えれば分かることなんですが、
あまりこういうシーンが今までなかったので…。
「NSMutableArrayから、
何かしらの条件に合致する要素を削除したい。」
となったときに、
・条件判定→ループ
・要素の削除→removeObject
で、
for (int i = 0; i < [aList count]; i++) {
・
・
・
}
と書き始めて、
「これじゃアカン!」
と…。
removeすると削除して詰めちゃうから、
インデックスがおかしくなる…。
と、
ちょっと考えてみて、
「index降順でループすればいいじゃん!」
という結論。
int aListCnt = (int)[aList count];
for (int i = aListCnt - 1; i >= 0; i--) {
MyClass *myClass = [aList objectAtIndex:i];
if ([myClass shouldBeRemovedFromList]) {
[aList removeObjectAtIndex:i];
}
}
for (int i = aListCnt - 1; i >= 0; i--) {
MyClass *myClass = [aList objectAtIndex:i];
if ([myClass shouldBeRemovedFromList]) {
[aList removeObjectAtIndex:i];
}
}
まぁ、
これまでこんなシーンがなかったんだなぁと、
なぜかしみじみw
んで、
int aListCnt = (int)[aList count];
というまどろっこしいのがあるんですが、
警告対策です。
countメソッドはNSUIntegerが返ってくるので、
for (int i = [aList count] - 1; …………
と書くと警告が出ます。
では、
for (NSUInteger i = [aList count] - 1; i >= 0; …………
と書いたらどうか?
これはこれで別な警告が出ます。
「unsignedなんだから、i>=0って常に真でしょ?」
みたいな。
まぁ、
for (int i = (int)[aList count] …………
と書けばいいんですが、
ループの条件が長いのも鬱陶しいので、
こんな整理にしてみました。
それでは。
ちゃお☆
まこぴー。