2017-12-27 6 views
2

配列をループして座標を取得しようとしていますが、エラーが発生し、配列にアクセスできません。データはSequeを通過し、印刷した場合、データが正しく転送されるように表示されますが、配列を繰り返し処理できず、緯度と経度を引き出すことができないのはなぜですか。配列の繰り返しでエラーが発生する

これはコンソールの出力です。

DeliveryDestinations(NameOrBusiness:オプション( "インN-アウトバーガー")、 FirstLineAddress:オプション( "550ニューホール博士")、SecondLineAddress: オプション(」米国 ")、CityLineAddress:オプション("サンノゼ ")、 PostcodeLineAddress:オプション(" CA 95110" )、DistanceToDestination: オプション(9.2807823200000001)、緯度:オプション(37.350253606833043)、ロング: オプション(-121.92182779312132))

import UIKit 
import MapKit 
import CoreLocation 

class DeliveryLocationsVC: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 

    var addressArr = [DeliveryDestinations]() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     print(addressArr) 


navigationItem.title = "Delivery Location" 
     // Do any additional setup after loading the view. 

     for (theKey, theValue) in addressArr { //<-- error can't access the elements in array 
      if (theKey == "Lat") { 
       if let coordinates:DeliveryDestinations = theValue { 
       print (coordinates) 
      } 
      print("Item \(theKey): \(theValue)") 
      } 
     } 
    } 
} 

マイアレイが来ている

for object in addressArr { 
    ... 
    // get coordinates from object 
    let lat = object.Lat 
    let long = object.Long 
} 

それともあなたが同様にあなたのテーブルの行のインデックスが必要な場合:OMあなたがアレイ(とは辞書を)持っているので、あなたがする必要がある

import Foundation 
import MapKit 

struct DeliveryDestinations { 
    var NameOrBusiness: String? 
    var FirstLineAddress: String? 
    var SecondLineAddress: String? 
    var CityLineAddress: String? 
    var PostcodeLineAddress: String? 
    var DistanceToDestination: CLLocationDistance? 
    var Lat: Double? 
    var Long: Double? 


    init(NameOrBusiness: String?, FirstLineAddress: String?, SecondLineAddress: String?, CityLineAddress: String?, PostCodeLineAddress: String?, DistanceToDestination: CLLocationDistance?, Lat: Double?, Long: Double?) { 
     self.NameOrBusiness = NameOrBusiness 
     self.FirstLineAddress = FirstLineAddress 
     self.SecondLineAddress = SecondLineAddress 
     self.CityLineAddress = CityLineAddress 
     self.PostcodeLineAddress = PostCodeLineAddress 
     self.DistanceToDestination = DistanceToDestination 
     self.Lat = Lat 
     self.Long = Long 

    } 

} 
+0

あなたは 'theKey'と' theValue'が含まれているために何を期待し?? – luk2302

+0

@ luk2302キーはLatになり、値はlongと同じ座標になります。キーは値になります。これを配列に配置して、この座標に基づいてピンをマップに挿入できるようにしてください。 – QuickSilver

+0

'theKey'を" Lat "にするのはなぜですか?それは意味をなさない、あなたは配列を持っている、どこにでも見つかる "緯度"がない。 – luk2302

答えて

3

以下の構造体は、このように反復されますすることができます:

for (i, object) in addressArr.enumerated() { 
    ... 
    // get coordinates from object 
    let lat = object.Lat 
    let long = object.Long 
    print ("Destination at index \(i) has coordinate: (\(lat), \(long))") 
} 

どのように私はそれが配列だったのですか?

コードで表記

var addressArr = [DeliveryDestinations]() 

オールウェイズこのオブジェクトDeliveryDestinationsの配列であること、を意味します。 これを印刷すると、配列内のオブジェクトの印刷が行われます。 あなたの場合、このオブジェクトは「辞書のような」記述を持っています。そのため、印刷機能はこのように印刷します。すべてのオブジェクトで

description機能であなたがオブジェクト(またはそれらのオブジェクトの配列)に印刷すると、テキストは次のようになりますどのように指定することができますが

+0

Zedravecこれは私にとって完璧に機能し、両方のソリューションが完璧です。 1つの質問は、ここで私は混乱しているので、これは配列ではなく、辞書ではないことをあなたはどのように知っていましたか? Lat:オプション(37.350253606833043)、ロング:オプション(-121.92182779312132))はキーと値のペアではありませんか? – QuickSilver

+2

@QuickSilver 'var addressArr = [DeliveryDestinations]()'は配列のピリオドです。それが何を含んでいても、それが文字列に変換される方法に関係なく、配列のままになります。 – luk2302

+0

@ luk2302申し訳ありませんが、私はこれについてかなり新しいので、まだ学んでいると説明しています。あなたの助けに感謝します。 – QuickSilver

関連する問題