Swift无法分配类型[CLLocationCoordinate2D]的不可变值

thi*_*guy 6 coordinates ios mapbox swift

有人可以解释为什么我收到错误"无法分配类型[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, longitude: -100.24319656647276),
    ]
    var shape = MGLPolygon(coordinates: &coordinates, count: UInt(coordinates.count))
    mapView.addAnnotation(shape)
}
Run Code Online (Sandbox Code Playgroud)

此代码不起作用:

override func viewDidLoad() {
    super.viewDidLoad()

    // does stuff
    var coords: [CLLocationCoordinate2D] = [
            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, longitude: -100.24319656647276),
        ]

    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)
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用.我甚至println(coordinates)vs println(coords),它给了我相同的输出.

dan*_*ard 14

将参数传递给函数时,默认情况下它们将作为不可变传递.就像你宣布它们一样let.

当您将coordsparam 传递给MGPolygon方法时,它将作为inout参数传递,这意味着这些值可以更改,但由于参数默认情况下是不可变值,因此编译器会抱怨.

您可以通过明确告诉编译器可以通过在其前面添加一个来修改此参数来修复它var.

func drawShape(var coords: [CLLocationCoordinate2D]) {
    var shape = MGLPolygon(coordinates: &coords, count: UInt(coords.count)) 
    mapView.addAnnotation(shape)
}
Run Code Online (Sandbox Code Playgroud)

前缀参数var意味着您可以在函数中改变该值.

编辑:Swift 2.2

请改用关键字inout.

func drawShape(inout coords: [CLLocationCoordinate2D]) {
    var shape = MGLPolygon(coordinates: &coords, count: UInt(coords.count)) 
    mapView.addAnnotation(shape)
}
Run Code Online (Sandbox Code Playgroud)