Search code examples
swiftmkmapviewswift2mkoverlaymkmapviewdelegate

Swift 2 MKMapViewDelegate rendererForOverlay compiler warning


I am trying to draw a polyline on a map in Swift 2. It all works well, but I get a compiler warning for this code:

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

}

This will give me a warning says that 'Result and parameters in mapView (rendererForOverlay) have different optionality than expected by protocol MKMapViewDelegate'

Now, this will compile fine, but it bugs me that the compiler warning is showing.

If I change the first line to

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

by removing the !, the warning will go away but I get an error that the return cannot be nil and the code will not compile anymore.

This is also a follow up to this thread where the same problem was stated but no satisfying answer is available: Swift 2 MKMapViewDelegate rendererForOverlay optionality

Can anyone shed any light on the correct way to use this function now in Swift 2?

Thanks.


Solution

  • Going by what autocomplete suggests the prototype looks like this:

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

    And apparently there's nothing you can do about it, except for returning return MKPolylineRenderer() where normally you would return nil.

    To me it looks like an implementation bug, because here's what the documentation says about the returned object:

    The renderer to use when presenting the specified overlay on the map. If you return nil, no content is drawn for the specified overlay object.

    I suggest you create a case for it in Apple's bug report