2017-12-27 2 views
2

배열을 반복하면서 좌표를 얻으 려하지만 오류가 발생하여 배열에 액세스 할 수 없습니다. 데이터는 seque를 통해 전달되고 인쇄되면 데이터가 올바르게 전송되므로 제대로 작동하지만 배열을 반복 할 수없고 위도와 경도를 가져올 수없는 이유가 해결되지 않습니다.배열 스위프트를 반복 할 때 오류가 발생했습니다.

이것은 콘솔의 출력입니다.

DeliveryDestinations (NameOrBusiness : 옵션 ("인앤 아웃 버거"), 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)") 
      } 
     } 
    } 
} 

내 배열 fr에오고있다. 톰

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 키가 위도 일 것이고 값은 키와 값이 같은 좌표가 될 것이며 값은 좌표가됩니다. 이 좌표를 기반으로 핀으로지도를 채울 수 있도록이 배열에 넣어보십시오. – QuickSilver

+0

'theKey'가 왜 "Lat"이어야 하는가? 그건 말이 안돼요, 당신은 배열을 가지고 있습니다, 어디서나 찾을 수있는 "위도"가 없습니다. – luk2302

답변

3

아래의 구조체를 당신은 배열 (아닌 사전)가 그래서 당신은 이런 식으로 반복되어 수행해야합니다

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

을 아니면 테이블 행의 인덱스를 필요로하는 경우뿐만 아니라 당신 할 수 있습니다 :

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]() 

에 allways이 개체 DeliveryDestinations의 배열 인 것을 의미한다. 인쇄 할 때 배열의 개체가 인쇄됩니다. 귀하의 경우,이 개체는 "사전과 같은"설명을 가지고 있으므로 인쇄 기능은 이와 같이 인쇄합니다. 모든 객체에서

, description 기능을 사용하면 텍스트가이 객체 (또는 그 객체의 배열)에 인쇄 할 때 같이 할 방법을 지정할 수는

+0

Zedravec 완벽하게 작동하는 두 가지 솔루션 모두 완벽하게 작동했습니다. 한 가지 질문은 내가 혼란스러워하는 곳이기 때문에 사전이 아니라 배열임을 어떻게 알았습니까? 위도 : 선택 사항 (37.350253606833043), 길게 : 선택 사항 (-121.92182779312132))은 키 - 값 쌍이 아닙니까? – QuickSilver

+2

@QuickSilver'var addressArr = [DeliveryDestinations]()', 배열, 마침표. 그것이 무엇을 포함하고 어떻게 그러한 것들이 스스로를 문자열로 변환하기로 결정했는지에 상관없이 배열로 남을 것입니다. – luk2302

+0

@ luk2302 유감스럽게도 나는 이것에 대해 아주 새로운 지식을 가지고 있기 때문에 아직도 배우고있다. 당신 도움을 많이 주셔서 감사합니다. – QuickSilver

관련 문제