現在のループは、タイトルが一致しない別のオーバーレイを見つけるfor
とすぐに、オーバーレイが存在するか存在しないと想定します。
しかし、その時点で、for
ループは残りのオーバーレイをチェックしていない可能性があります (そのうちの 1 つが探しているオーバーレイである可能性があります)。
例えば:
- マップ上に、A、B、C、および D というタイトルのオーバーレイが既に 4 つあるとします。
- 確認したいオーバーレイ (
polu
) のタイトルが Cであるとします。
- 最初にチェックされるオーバーレイは A です。A は C と一致しないため、既存のコードはすぐに C という名前の別のオーバーレイを追加します。
- その後、
for
ループは継続し、B を調べます。ここでも、B は C と一致しないため、既存のコードは C という名前の別のオーバーレイを追加します。
- その後、ループが継続し、C を見て、「既に追加されました」とログに記録します。
- 次にループが続き、D を見て、それが C と一致しないことを確認し、別のオーバーレイを追加します。
代わりに、一致するタイトルが見つかったときにループを停止し、一致するタイトルが見つからずにループが終了した場合は、オーバーレイ を追加します。
例:
BOOL poluExists = NO;
for (MKPolyline *feature1 in self.mapView.overlays) {
NSLog(@"feature1.title: %@", feature1.title);
NSLog(@"Polu.title: %@", polu.title);
//STOP looping if titles MATCH...
if ([feature1.title isEqualToString:polu.title]) {
poluExists = YES;
break;
}
}
//AFTER the loop, we know whether polu.title exists or not.
//If it existed, loop would have been stopped and we come here.
//If it didn't exist, loop would have checked all overlays and we come here.
if (poluExists) {
NSLog(@"Already added");
}
else {
NSLog(@"NOT");
[self.mapView addOverlay:polu];
}
問題の 2 番目の例では、最初に指定された元のオブジェクトが呼び出されたcontainsObject:
場合にのみ機能します。この場合、オーバーレイのプロパティではなくポインター アドレスを比較するためです。polu
addOverlay
containsObject:
title