4

开发人员,我正在尝试在地图视图上实现多边形叠加,如下所示:

private func drawOverlayForObject(object: MyStruct) {
    if let coordinates: [CLLocationCoordinate2D] = object.geometry?.coordinates {
        let polygon = MKPolygon(coordinates: coordinates, count: coordinates.count)
        self.mapView.addOverlay(polygon)
    }
}

出现以下错误:

调用中缺少参数“interiorPolygons”的参数

根据文档: Apple Docu:

可变指针

当函数被声明为采用 UnsafeMutablePointer 参数时,它可以接受以下任何一种:

  • nil,作为空指针传递
  • UnsafeMutablePointer 值
  • 一个 in-out 表达式,其操作数是 Type 类型的存储左值,作为左值的地址传递
  • 一个 in-out [Type] 值,作为指向数组开头的指针传递,并在调用期间延长生命周期

现在我认为我的方法是正确的,提供一个 [CLLocationCoordinate2D] 数组。有没有人遇到过同样的问题并找到了解决方法?

谢谢罗尼

4

2 回答 2

9

您得到的错误是 Swift 的神秘方式,即它找不到与您的参数匹配的方法。如果您确实尝试传递interiorPolygons参数,您会得到同样令人困惑的:

调用中的额外参数“interiorPolygons”

您的代码非常接近;你只需要几个小改动。在您引用的文档中,它说您可以通过的一件事是:

一个 in-out [Type] 值,作为指向数组开头的指针传递,并在调用期间延长生命周期

所以,它正在寻找一个in-out 参数。这是通过传递coordinates前缀来完成的&,如下所示:

MKPolygon(coordinates: &coordinates, count: coordinates.count)

但是,输入输出参数不能是常数。从文档:

您只能将变量作为输入输出参数的参数传递。您不能将常量或文字值作为参数传递,因为无法修改常量和文字。

coordinates因此,您需要先定义var

if var coordinates: [CLLocationCoordinate2D] = object.geometry?.coordinates

这使得整个函数看起来像这样:

private func drawOverlayForObject(object: MyStruct) {
    if var coordinates: [CLLocationCoordinate2D] = object.geometry?.coordinates {
        let polygon = MKPolygon(coordinates: &coordinates, count: coordinates.count)
        self.mapView.addOverlay(polygon)
    }
}
于 2014-09-24T02:52:13.877 回答
0

我的最终解决方案是从几个教程中挑选并整合:

func setPolylineFromPoints(locations:[CLLocation]){
    if locations.count == 0 {
        return;
    }
// while we create the route points, we will also be calculating the bounding box of our route
// so we can easily zoom in on it.
    var pt : UnsafeMutablePointer<MKMapPoint>? // Optional
    pt = UnsafeMutablePointer.alloc(locations.count)
    for idx in 0..<locations.count-1 {
       let location = locations[idx]
       let point = MKMapPointForCoordinate(location.coordinate);
       pt![idx] = point;
    }
    self.polyline = MKPolyline(points:pt!, count:locations.count-1)
// clear the memory allocated earlier for the points
    pt?.destroy()
    pt?.dealloc(locations.count)
}  
于 2015-12-20T22:15:43.837 回答