6

我正在尝试在 Swift 2 中的地图上绘制折线。一切正常,但我收到此代码的编译器警告:

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {

    if overlay is MKPolyline {

        let polylineRenderer = MKPolylineRenderer(overlay: overlay)

        polylineRenderer.strokeColor = UIColor.redColor()

        polylineRenderer.lineWidth = 5

        return polylineRenderer
    }

    return nil

}

这会给我一个警告说' mapView(rendererForOverlay)中的结果和参数具有与协议 MKMapViewDelegate 预期的不同的可选性'

现在,这将编译得很好,但是编译器警告正在显示,这让我很烦恼。

如果我将第一行更改为

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {

通过删除!,警告将消失,但我收到一个错误,即返回不能为 nil,代码将不再编译。

这也是该线程的后续行动,其中陈述了相同的问题但没有令人满意的答案: Swift 2 MKMapViewDelegate rendererForOverlay optionality

任何人都可以阐明现在在 Swift 2 中使用此功能的正确方法吗?

谢谢。

4

2 回答 2

21

按照自动完成的方式,原型看起来像这样:

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer

显然你无能为力,除了返回return MKPolylineRenderer()通常你会返回 nil 的地方。

对我来说,它看起来像是一个实现错误,因为这是文档中关于返回对象的内容:

在地图上呈现指定叠加层时使用的渲染器。如果您返回 nil,则不会为指定的覆盖对象绘制任何内容。

我建议您在Apple 的错误报告中为它创建一个案例

于 2015-09-08T08:10:47.033 回答
5

不要返回零。这仅对您创建的叠加层调用,因此不要检查叠加层是否为 MKPolyline,而是检查它是哪个叠加层。如果您只有一个,则返回指定的折线渲染器而不检查它是哪一个。

于 2015-09-08T08:12:35.553 回答