我正在尝试将覆盖添加到mkmapview,通过首先在map overlays(mapview.overlays:[mkoverlay])存储中查找覆盖来避免重复。
这就是我目前正在尝试的

func addBoundary(points: [CLLocationCoordinate2D]) -> MKPolygon! {
    var x = points
    let polygon: MKPolygon = MKPolygon(coordinates: &x, count: points.count)

    if overlays.indexOf(polygon as MKOverlay) == nil {
        addOverlay(polygon)
        return polygon
    }
    return nil
}

但是,我得到了以下错误
无法将“mkoverlay”类型的值转换为所需的参数类型“@noescape(mkoverlay)throws->bool”
我想这很简单。我以前用自己的结构尝试过这样的检查,但它似乎不适用于公共对象的预定义数组。
有人能解释一下我的错误吗?我猜这与mkoverlay不可比有关-如果是这样的话,我不确定如何最好地将该功能附加到预定义的对象…
非常感谢
P.S.这是斯威夫特2.0
我主要尝试了更简单、更合理的使用方法
if !overlays.contains(polygon) {
    addOverlay(polygon)
}

…产生了同样的错误-似乎我遗漏了什么。

最佳答案

正如您推测的,这与MKOverlay不可比较有关(特别是Equatable),而且由于MKOverlay是一个协议,您不能像扩展类那样扩展它。在这个答案中有很好的解释:How do I do indexOfObject or a proper containsObject
如果您确定overlays实际上只包含MKPolygon对象,请尝试将[MKOverlay]强制转换为[MKPolygon]

    let polygons = mapView.overlays as? [MKPolygon]
    if polygons?.indexOf(polygon) == nil { ... }

MKPolygon是nsObject,因此as of Swift 2, it automatically conforms to Equatable
如果不尝试,就不清楚MKPolygon如何实现平等比较。如果它是默认的nsobject指针比较,那么它对您的示例不起作用,因为您正在实例化新的MKPolygon对象。您可以根据自己的逻辑对MKPolygonimplement -isEqual: and -hash进行子类化,以比较坐标点。

10-08 12:43