【问题标题】:Nil is incompatible with return type 'MKOverlayRenderer'Nil 与返回类型 'MKOverlayRenderer' 不兼容
【发布时间】:2015-10-13 12:29:23
【问题描述】:

我收到了这个错误

“Nil 与返回类型 'MKOverlayRenderer' 不兼容”

这是我的代码:

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKCircle {
      let circleRenderer = MKCircleRenderer(overlay: overlay)
      circleRenderer.lineWidth = 1.0
      circleRenderer.strokeColor = UIColor.purpleColor()
      circleRenderer.fillColor = UIColor.purpleColor().colorWithAlphaComponent(0.4)
      return circleRenderer
    }
      return nil
  }

为什么会这样?

【问题讨论】:

    标签: ios swift mapkit swift2


    【解决方案1】:

    返回 MKPolylineRenderer() 而不是返回 nil。

    【讨论】:

    • 我在这里混合了这些建议; NSAssert([myOverlay isKindOfClass:[MyOverlay class], @"some message about %@", myOverlay); return [[MKPolylineRenderer alloc] initWithOverlay:myOverlay]; 这是两全其美的方法,发现了我的错误,但抑制了 XCode 关于未返回正确类型的警告。
    【解决方案2】:

    这似乎在这里得到了回答:

    Swift 2 MKMapViewDelegate rendererForOverlay optionality

    您只是不允许返回 nil。您的叠加层必须有一个渲染器。用断言替换“r​​eturn nil”。

    【讨论】:

      【解决方案3】:

      您不应该为此委托函数返回nil。地图视图需要为每个叠加层进行渲染。在你的情况下,你应该这样做:

      func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer 
      {
          assert(overlay is MKCircle, "overlay must be circle")
      
          let circleRenderer = MKCircleRenderer(overlay: overlay)
          circleRenderer.lineWidth = 1.0
          circleRenderer.strokeColor = UIColor.purpleColor()
          circleRenderer.fillColor = UIColor.purpleColor().colorWithAlphaComponent(0.4)
          return circleRenderer
      }
      

      我认为您不应该返回MKPolylineRenderer(),因为它可能会隐藏您的错误。

      【讨论】:

        【解决方案4】:

        因为 nil 不是 MKOverlayRenderer。如果您希望函数可能返回 nil,则返回类型应该是可选的。按照定义,该函数只能返回实际的 MKOverlayRenderer。

        【讨论】:

        • 我应该用什么来代替 nil?
        • @milo526 可选手段?你能简单解释一下吗?
        • 可选值可以是 nil 或类型的值。当声明一个可选项时,你应该在类型声明中添加一个?let myString:String? 声明了一个 String 类型的变量,它可以是字符串或 nil。
        • @milo526:它是 MKMapView 的委托方法,因此将返回值更改为可选是不可行的。在这种情况下,第二个选项是最好的。
        • ...你让我解释什么可选选项在哪里。 String 可选只是一个示例,您应该在您的情况下使用 MKOverlayRenderer 可选,因此使用MKOverlayRenderer?
        猜你喜欢
        • 2014-08-29
        • 2016-05-28
        • 2019-09-06
        • 2013-11-11
        • 2016-02-14
        • 1970-01-01
        • 2020-08-13
        • 2021-04-15
        • 1970-01-01
        相关资源
        最近更新 更多