2015-07-08 14 views
6

Birisi neden "[CLLocationCoordinate2D] tipinin değişmez değerini atamadı" hatasını aldığımı açıklayabilir miyim? İki senaryo vereceğim. İkincisinin çalışmasını istememin nedeni, bir döngüde olacağım ve bunu her seferinde drawShape fonksine aktarmam gerektiğidir.Swift, [CLLocationCoordinate2D] tipinin değişmez değerini atayamaz.

Bu kod çalışır:

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) 
} 

Bu kod işe ETMEZ: Bu işe yaramazsa neden anlamıyorum

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) 
} 

. Hatta println(coordinates) vs println(coords) var ve bana her biri için aynı çıktıyı verir.

cevap

14

Parametreleri bir işleve geçirirken, varsayılan olarak değiştirilemez olarak geçirilir. Onları bir let olarak bildirmişseniz aynıdır.

Eğer MGPolygon yöntem haline coords param geçmesine

, bu o değerler değişebilir anlamına gelir bir inout parametre olarak geçirilen, ancak parametre varsayılan olarak değişmez bir değer olduğundan, derleyici şikayet ediyor.

Derleyiciye, bu parametrenin var ile ön eklenmesiyle değiştirilebileceğini açıkça belirterek düzeltebilirsiniz. var bir parametresinin önüne

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

işlevi içinde bu değeri mutasyona anlamına gelir.

Düzenleme: 2,2

Swift anahtar kelime inout yerine kullanın.

func drawShape(inout coords: [CLLocationCoordinate2D]) { 
    var shape = MGLPolygon(coordinates: &coords, count: UInt(coords.count)) 
    mapView.addAnnotation(shape) 
} 
+0

hero! Açıklama için teşekkürler ve düzeltin! – thinkgeekguy

+0

FYI - Derleyici, 'var' anahtar kelimesinin Swift3'te kaldırılacağı konusunda uyardı. Her bir alanı doğrudan kopyalamanın ötesinde iyi bir çözüm bulamadım. :( – eimmer

+0

'var', Swift 2.2'de 'inout' ile değiştirilmiştir. – EFC