I am trying to do the following in swift - Trying to reverse decode a list of addresses in an array and print their latitude/longitude coordinates. The code I have is as follows.
let addressArray = ["Address 1", "Address 2"] var coordinatesArray = [CLLocationCoordinate2D]() override func viewDidLoad() { super.viewDidLoad() createAddressList() printAddressList() } func printAddressList() { for i in 0 ..< addressArray.count { print("Address = \(addressArray[i]) Coordinates = \(coordinatesArray[i].latitude),\(coordinatesArray[i].latitude)") } func createAddressList() { for i in 0 ..< addressArray.count { let address = addressArray[i] geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in print("Address = \(address)"); if let placemark = placemarks?.first { let coordinate = placemark.location?.coordinate self.coordinatesArray.append(coordinate!) } }) } } } The code prints only the first address that's decoded and nothing happens then.
I do have a fix for this like the below one, which is to move the printAddressList call from viewDidLoad method like this
func createAddressList() { if count < self.addressArray.count { let address = addressArray[count] geocoder.geocodeAddressString(address, completionHandler: {(placemarks, error) -> Void in print("Address = \(address)"); if let placemark = placemarks?.first { let coordinate = placemark.location?.coordinate self.coordinatesArray.append(coordinate!) } print("Count = \(self.count)") self.count += 1 self.createAddressList() }) } else { printAddressList() } } Even though the latter solution works, I see that it's not clean, would like to know the right way to do this while making the code readable and clean.