【问题标题】:Swift error - Cannot convert value of type 'MKOverlay' to expected argument type '@noescape (MKOverlay) throws -> Bool' - when performing indexOfSwift 错误 - 无法将“MKOverlay”类型的值转换为预期的参数类型“@noescape (MKOverlay) throws -> Bool” - 执行 indexOf 时
【发布时间】:2015-10-14 09:37:47
【问题描述】:

我正在尝试将叠加层添加到 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 -> Bool”

我猜这很简单。过去我曾设法用我自己的结构进行这样的检查,但它似乎不适用于公共对象的预定义数组。

有人能解释一下我的错误吗?我猜这与 MKOverlay 不具有可比性有关 - 如果是这种情况,我不确定如何最好地将该功能附加到预定义的对象......

非常感谢

附言这是 Swift 2.0

我主要尝试了更简单、更合乎逻辑的使用方法

if !overlays.contains(polygon) {
    addOverlay(polygon)
} 

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

【问题讨论】:

  • 也许只是选择简单的选项,然后删除所有内容并添加您要查看的内容。即 mapView.removeOverlays(mapView.overlays)
  • 这就是它一直到现在的运作方式。当它们从数据库中提取时,逐渐添加这些叠加层(因此它们保留在屏幕外)会很好。当前的方法相当原始,我希望以这种方式对其进行改进
  • 你能转换成一个 NSValue 然后比较它吗?这就是我比较位置的方式......
  • 我的主要问题是使用新的内置函数映射/枚举数组。毫无疑问,我可以迭代/遍历数组,并以老式的方式进行比较,我只是希望使用一些花哨的新 Swift 2.0 函数......可悲的是,我似乎要么做错了,要么还没到呢:(
  • 也许试试,让 polys = mapview.overlays.map { $0 as! MKOverlay } 然后循环遍历而不是遍历 mapview.overlays。我知道在使用 MKAnnotations 时我必须这样做,因为演员表会失败,但通过 map 方法它可以工作

标签: arrays swift object indexof


【解决方案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 进行子类化来比较坐标点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多