class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate { @Published var region = MKCoordinateRegion() @Published var location = CLLocationCoordinate2D() private let manager = CLLocationManager() override init() { super.init() manager.delegate = self manager.desiredAccuracy = kCLLocationAccuracyBest manager.requestWhenInUseAuthorization() manager.startUpdatingLocation() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { locations.last.map { let center = CLLocationCoordinate2D(latitude: $0.coordinate.latitude, longitude: $0.coordinate.longitude) let span = MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02) region = MKCoordinateRegion(center: center, span: span) } } func convertAddress(address: String) { getCoordinate(addressString: address) { (location, error) in if error != nil { } DispatchQueue.main.async { self.location = location } } } private func getCoordinate(addressString : String, completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) { let geocoder = CLGeocoder() geocoder.geocodeAddressString(addressString) { (placemarks, error) in if error == nil { if let placemark = placemarks?[0] { let location = placemark.location! completionHandler(location.coordinate, nil) return } } completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?) } } }