2016-12-30 17 views
0

コアデータモデルからデータを取得してマップに表示したいアプリケーションがあります。注釈をマップビューに追加すると、エラーが発生します。 'Swift._ContiguousArrayStorage <'の値を 'MKAnnotation'()にキャストできませんでした。この同じロジックはSwift 2で動作しましたが、明らかにSwift 3では動作しませんでした。どこでどのように表記法をマップビューに追加しますか?コードは次のとおりです。マップビューに注釈を追加する際にエラーが発生する

var gauges = [Gauges]() 

と注釈に関連する情報を保持するクラスゲージを作成しました:

override func viewDidAppear(_ animated: Bool) { 

    var rainFallGauges = [RainFallGauge]() 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "RainFallGauge") 

    do { 
     rainFallGauges = try coreDataStack.context.fetch(fetchRequest) as! [RainFallGauge] 

     obsCount = rainFallGauges.count 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 

    if obsCount == 0 { 

     let alert = UIAlertController(title: "Sorry", message: "No gauges found", preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 
    } else { 

     for rainFallGauge in rainFallGauges { 

      resultsGauge = rainFallGauge.value(forKey: "gaugeName") as? String 
      resultsLatitude = rainFallGauge.value(forKey: "gaugeLatitude") as? String 
      resultsLongitude = rainFallGauge.value(forKey: "gaugeLongitude") as? String 
      print(resultsGauge) 

      if (resultsLatitude != nil && resultsLongitude != nil) && (resultsLatitude?.isEmpty == false && resultsLongitude?.isEmpty == false) { 
       let latNSString = NSString(string: resultsLatitude!) 
       setLatitude = latNSString.doubleValue 
       print(setLatitude) 

       let longNSString = NSString(string: resultsLongitude!) 
       setLongitude = longNSString.doubleValue 
       print(setLongitude) 

       self.gauges.append(Gauges(gaugeTitle: resultsGauge, latitude: setLatitude, longitude: setLongitude)) 
       print(gauges.count) 
      } else if gauges.count == 0 { 
       let alert = UIAlertController(title: "Sorry", message: "No gauges", preferredStyle: UIAlertControllerStyle.alert) 
       alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
       self.present(alert, animated: true, completion: nil) 
      } 
     } 
    } 

    self.gaugeMap.delegate = self 
    self.gaugeMap.addAnnotation(self.gauges as! MKAnnotation) 

    gaugeMap.mapType = .hybrid 

    let rectToDisplay = self.gauges.reduce(MKMapRectNull) { 
     (mapRect: MKMapRect, gauge: Gauges) -> MKMapRect in 
     let placePointRect = MKMapRect(origin: gauge.location.mapPoint, size: MKMapSize(width: 0, height: 0)) 

     return MKMapRectUnion(mapRect, placePointRect) 
    } 

私は、アレイ「ゲージ」として上で宣言されています。

addAnnotationステートメントの正しい構文と、どこに行かなければならないのかを教えてください。

+0

この行は意味をなさない:

self.speciesMap.addAnnotations(self.places) 

が、私は単純化しに行くことによって私の問題を解決しましたself.gauges as!MKAnnotation) 'もし' self.gauges'が '' Gauges ''ならば、どうすればMKAnnotationですか?スウィフト2で何とか働いたことを教えてください。あなたが話している言語が何であれ、それはナンセンスです。 – matt

+0

はMKAnnotationのGaugesサブクラスですか? –

+0

あなたの貴重な洞察をいただきありがとうございます、私はそれが実際にあった私の古いアプリのラインを誤解しました: – user1698875

答えて

0

あなたの洞察をいただきありがとうございます。私は私の古いアプリでラインを読み違えていたが、それは実際にだった:( `self.gaugeMap.addAnnotation:

for rainFallGauge in rainFallGauges { 

      resultsGauge = rainFallGauge.value(forKey: "gaugeName") as? String 
      resultsLatitude = rainFallGauge.value(forKey: "gaugeLatitude") as? String 
      resultsLongitude = rainFallGauge.value(forKey: "gaugeLongitude") as? String 
      print(resultsGauge) 

      if (resultsLatitude != nil && resultsLongitude != nil) && (resultsLatitude?.isEmpty == false && resultsLongitude?.isEmpty == false) { 
       let latNSString = NSString(string: resultsLatitude!) 
       setLatitude = latNSString.doubleValue 
       print(setLatitude) 

       let longNSString = NSString(string: resultsLongitude!) 
       setLongitude = longNSString.doubleValue 
       print(setLongitude) 

       gaugeMap.addAnnotation(OneGauge(title: resultsGauge, subtitle: "", coordinate: CLLocationCoordinate2D(latitude: setLatitude, longitude: setLongitude))) 

      } 
     } 
    } 
    gaugeMap.mapType = .hybrid 
関連する問題