Swift错误 - 无法将'MKOverlay'类型的值转换为预期的参数类型'@noescape(MKOverlay)throws - > Bool' - 执行indexOf

时间:2015-10-14 09:37:48

标签: arrays swift object indexof

我正在尝试为MKMapView添加叠加层,首先在地图叠加层(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 - >布尔“

我猜它很简单。我以前用自己的结构设法做了这样的检查,但它似乎不适用于预定义的公共对象数组。

有人可以对我的错误有所了解。我猜这与MKOverlay无法比较有关 - 如果是这样的话,我不确定如何最好地将该功能附加到预定义的对象......

非常感谢

P.S。这是Swift 2.0

我主要尝试使用

更简单,更合乎逻辑的方法
if !overlays.contains(polygon) {
    addOverlay(polygon)
} 

...产生相同的错误 - 我似乎错过了一些东西。

1 个答案:

答案 0 :(得分:1)

正如您所推测的,它与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进行子类化,以比较坐标点。