有人可以解释为什么我收到错误“无法分配类型[CLLocationCoordinate2D]的不可变值”我会给出两个场景.我希望第二个工作的原因是因为我将处于循环中并且需要每次都将它传递给drawShape函数.
此代码有效:
func drawShape() { var coordinates = [ CLLocationCoordinate2D(latitude: 40.96156150486786,longitude: -100.24319656647276),CLLocationCoordinate2D(latitude: 40.96456685906742,longitude: -100.25021235388704),CLLocationCoordinate2D(latitude: 40.96528813790064,longitude: -100.25022315443493),CLLocationCoordinate2D(latitude: 40.96570116316434,longitude: -100.24954721762333),CLLocationCoordinate2D(latitude: 40.96553915028926,longitude: -100.24721925915219),CLLocationCoordinate2D(latitude: 40.96540144388564,longitude: -100.24319644831121),CLLocationCoordinate2D(latitude: 40.96156150486786,] var shape = MGLPolygon(coordinates: &coordinates,count: UInt(coordinates.count)) mapView.addAnnotation(shape) }
此代码不起作用:
override func viewDidLoad() { super.viewDidLoad() // does stuff var coords: [CLLocationCoordinate2D] = [ CLLocationCoordinate2D(latitude: 40.96156150486786,] self.drawShape(coords) } func drawShape(coords: [CLLocationCoordinate2D]) { var shape = MGLPolygon(coordinates: &coords,count: UInt(coords.count)) //---this is where the error shows up mapView.addAnnotation(shape) }
我不明白为什么这不起作用.我甚至有println(coordinates)和println(coords),它给了我相同的输出.
解决方法
将参数传递给函数时,默认情况下它们将作为不可变传递.就像你将它们声明为let一样.
当您将coords param传递给MGPolygon方法时,它将作为inout参数传递,这意味着这些值可以更改,但由于参数默认为不可变值,因此编译器会抱怨.
您可以通过明确告诉编译器可以通过在其前面加上var来修改此参数来修复它.
func drawShape(var coords: [CLLocationCoordinate2D]) { var shape = MGLPolygon(coordinates: &coords,count: UInt(coords.count)) mapView.addAnnotation(shape) }
使用var前缀参数意味着您可以在函数中改变该值.
编辑:Swift 2.2
请改用关键字inout.
func drawShape(inout coords: [CLLocationCoordinate2D]) { var shape = MGLPolygon(coordinates: &coords,count: UInt(coords.count)) mapView.addAnnotation(shape) }