質問: マップに追加したoverlayの中から特定のoverlaを選択して削除するにはどうすればいいでしょうか? ドキュメントには次のようにあるのですが、使い方が全くわかりません。 いろいろググっても参考になるようなものがありません。 overlayを選択する attribute mapkit.Overlay selectedOverlay; overlayを削除する mapkit.Overlay removeOverlay(mapkit.Overlay overlay); 次のように試してみたのですが、エラーが表示されます ``` myMapView.removeOverlays(overlays: [MKOverlay]) ``` Editor placeholder in source file Extraneous argument label 'overlays:' in call Replace 'overlays: ' with ' Replaceをすると次のようになり、やはりエラーが出ます ``` myMapView.removeOverlays([MKOverlay]) ``` Cannot convert value of type '([MKOverlay]).Type' to expected argument type '[MKOverlay]' Editor placeholder in source file
回答: エラーの内容からみたところ、`myMapView.removeOverlays([MKOverlay])`とそのままコードに書いてしまっているのが原因のようです。 引数の`[MKOverlay]`には削除したいMKOverlayのインスタンスを配列で指定する必要があります。 `MKOverlay`はclassそのものなので、型を変換できないというエラーがでてます。 例えば、すべてのoverlayを削除する場合は以下の様に書くことができます。 ``` myMapView.removeOverlays(myMapView.overlays) ``` また、選択したOverlayを削除したい場合には、どのOverlayを削除したいかを特定する必要があります。 簡単な例ですが、タップした座標のOverlayを削除する場合には以下の様なコードになります。 myMapViewにタップジェスチャーを紐づけて、タップした座標にOverlayが有れば、それを削除しています。 ``` @IBAction func didTapGesture(_ sender: UITapGestureRecognizer) { // タップした座標をマップ内の座標に変換 let touchPoint = sender.location(in: myMapView) let touchCoordinate = myMapView.convert(touchPoint, toCoordinateFrom: myMapView) let mapPoint = MKMapPoint(touchCoordinate) var deleteTarget:[MKOverlay] = [] for overlay in myMapView.overlays { let ovRect = overlay.boundingMapRect // タップした座標がオーバーレイに含まれている場合は削除対象に加える if ovRect.contains(mapPoint) { deleteTarget.append(overlay) } } // マップから対象を削除 myMapView.removeOverlays(deleteTarget) } ``` ※上記の例の場合は、Overlayの形を無視してRectの範囲で判定してます。OverlayがMKCircleのように円形たったりする場合は正確な判定になっていないのでご注意ください。