web-dev-qa-db-ja.com

Swift 2のすべてのマップ注釈を削除するにはどうすればよいですか

ボタンを使用してすべてのマップアノテーションを削除する作業コードがありましたが、xcode 7に更新した後、エラーが発生しています。

タイプ「MKAnnotation」はプロトコル「SequenceType」に準拠していません

if let annotations = (self.mapView.annotations as? MKAnnotation){
    for _annotation in annotations {
        if let annotation = _annotation as? MKAnnotation {
            self.mapView.removeAnnotation(annotation)
        }
    }
}
25
user4812000

In Swift 2 annotationsは非オプション配列[MKAnnotation]だから簡単に書くことができます

let allAnnotations = self.mapView.annotations
self.mapView.removeAnnotations(allAnnotations)

型キャストなし。

61
vadian
self.mapView.removeAnnotations(self.mapView.annotations)

ユーザーの場所を削除したくない場合。

self.mapView.annotations.forEach {
  if !($0 is MKUserLocation) {
    self.mapView.removeAnnotation($0)
  }
}

注:Objective-Cにはジェネリックが追加されました。「アノテーション」配列の要素をキャストする必要はなくなりました。

19
Daniel

問題は、2つの方法があることです。 1つはMKAnnotationオブジェクトを受け取るremoveAnnotationで、もう1つはMKAnnotationの配列を受け取るremoveAnnotationsです。一方の末尾の「s」に注意してください。 [MKAnnotation]MKAnnotationへの配列、または単一のオブジェクトからキャストしようとすると、プログラムがクラッシュします。コードの行self.mapView.annotationsは配列を作成します。したがって、メソッドremoveAnnotationを使用している場合、以下に示すように、配列内の単一オブジェクトの配列にインデックスを付ける必要があります。

let previousAnnotations = self.mapView.annotations
if !previousAnnotations.isEmpty{
  self.mapView.removeAnnotation(previousAnnotations[0])
}

したがって、ユーザーの位置を維持しながら、さまざまな注釈を削除できます。配列からオブジェクトを削除する前に、常に配列をテストする必要があります。そうしないと、境界外エラーまたはnilエラーが発生する可能性があります。

注:removeAnnotationsメソッド(s付き)を使用すると、すべての注釈が削除されます。 nilを取得している場合、空の配列があることを意味します。 ifの後にelseステートメントを追加することで、それを確認できます。

    else{print("empty array")}
1
ZaneMan