Swift получить строку из завершения Handler

import Foundation
import CoreLocation

class Converters  {
private var coordinate: String = ""
let geocoder = CLGeocoder()
func CityToCoordinate(city: String) ->String {
    geocoder.geocodeAddressString(city, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in
        if((error) != nil){
            print("Error", error)
        }
        if let placemark = placemarks?.first {
            let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
            self.coordinate = "\(coordinates.latitude),\(coordinates.longitude)"
            print(self.coordinate) //Here, I get the value: 47.7845996,19.1310416
        }
    })
    print(coordinate) //Has no value, but I need the same: "47.7845996,19.1310416"
    return coordinate // Don't return anything, I set in geocoder
}


}

Образ

Любое решение? Я хочу получить строку из события завершений, мне нужно вернуть координаты.

1 ответ

Решение

Добавьте обработчик завершения в подпись CityToCoordinate:

completion: (string: String)->()

и используйте его там, где доступны данные.

Как это:

class Converters  {
    private var coordinatese: String = ""
    let geocoder = CLGeocoder()

    func CityToCoordinate(city: String, completion: (string: String)->()) {
        geocoder.geocodeAddressString(city, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in
            if((error) != nil){
                print("Error", error)
            }
            if let placemark = placemarks?.first {
                let coordinates:CLLocationCoordinate2D = placemark.location!.coordinate
                self.coordinatese = "\(coordinates.latitude),\(coordinates.longitude)"

                completion(string: self.coordinatese)
            }
        })
    }
}

И назовите это завершающим замыканием:

let conv = Converters()
conv.CityToCoordinate("Paris") { (string) in
    print(string)  // 48.8567879,2.3510768
}
Другие вопросы по тегам