将MKAnnotation数组转换为set

时间:2018-08-18 11:13:07

标签: ios swift mapkit

我有一种情况,我迅速将地图注释作为[MKAnnotation]数组。现在,我需要将其转换为用于某些操作的集合。如何迅速做到这一点?基本上,在更新地图视图时,我只需要在地图上添加不存在的注释即可。

2 个答案:

答案 0 :(得分:0)

您可以使用mapView.view(for:) as mentioned here来查找地图上是否存在注释:

    if (self.mapView.view(for: annotation) != nil) {
        print("pin already on mapview")
    }

答案 1 :(得分:0)

“基本上,在更新地图视图时,我只需要在地图上添加不存在的注释。”

我们首先需要定义什么使两个注释相等(在您的方案中)。一旦清除,您将覆盖isEqual方法。然后,您可以将注释添加到Set

这里是一个例子:

class MyAnnotation : NSObject,MKAnnotation{
    var coordinate: CLLocationCoordinate2D
    var title: String?

    convenience init(coord : CLLocationCoordinate2D, title: String) {
        self.init()
        self.coordinate = coord
        self.title = title
    }

    private override init() {
        self.coordinate = CLLocationCoordinate2D(latitude: 0, longitude: 0)
    }

    override func isEqual(_ object: Any?) -> Bool {
        if let annot = object as? MyAnnotation{
            // Add your defintion of equality here. i.e what determines if two Annotations are equal.
            return annot.coordinate.latitude == coordinate.latitude && annot.coordinate.longitude == coordinate.longitude && annot.title == title
        }
        return false
    }
}

在上面的代码中,MyAnnotation的两个实例具有相同的坐标和相同的标题时,它们被认为是相等的。

let ann1 = MyAnnotation(coord: CLLocationCoordinate2D(latitude: 20.0, longitude: 30.0), title: "Annot A")
let ann2 = MyAnnotation(coord: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0), title: "Annot B")
let ann3 = MyAnnotation(coord: CLLocationCoordinate2D(latitude: 20.0, longitude: 30.0), title: "Annot A")

var annSet = Set<MyAnnotation>()
annSet.insert(ann1)
annSet.insert(ann2)
annSet.insert(ann3)

print(annSet.count)  // Output : 2 (ann1 & ann3 are equal)