Распределение результатов обратного геокодирования по глобальной переменной - PullRequest
0 голосов
/ 29 мая 2018

Я использую Swift 4 и Xcode 9.3.1.Я в том числе скриншоты кода.

Я новичок в мобильной разработке / программировании в целом и думал о том, как это сформулировать.Так что это лучшее, что я могу объяснить:

Я создаю приложение, которое получает местоположение пользователя для отправки ему помощи. Приложение получает координаты пользователя и отображаетTextView с их адресной информацией.Так что довольно прямая функциональность mapKit / coreLocation.Пока все хорошо: получение координат с помощью startUpdatingLocation () работает нормально, и я использовал Reverse Geocoder, чтобы получить название улицы и местность .Но они - означают расшифрованные строки улиц и населенных пунктов - распечатываются, только если я назову их в закрытии , а не за его пределами.Я понял (правильно или неправильно?) , что переменные, которые должны быть доступны для нескольких функций в классе, должны быть объявлены глобально наверху.Однако я не могу понять, как извлечь информацию из этого замыкания, чтобы использовать ее в другом месте.

Я гуглял и читал вопросы в stackOverflow, и я чувствую, что чего-то действительно простого не хватает, но могуне понять что.То, что я до сих пор безуспешно пытался:

1_ Определение глобальных переменных в виде пустых строк в начале класса и использование имен переменных внутри замыкания, где происходит обратный метод геокодирования, в попытке сохранить результирующий результатстрок, но когда я пытаюсь напечатать переменные вне замыкания, глобальная переменная остается неподвижной и пустой строкой ("").

[глобальные переменные объявлены вверху] [1]

2_ Определение пустого глобального массива строк и добавление информации из замыкания в глобальный массив.Все еще получил пустой массив за пределами закрытия.(так же, как 1)

3_Создать функцию --func decodedString () - в вернуть данные в виде строки, поэтому я могу использовать их, объявив

*let streetLocation : String = decodedString()*

Однако, когда я объявляю эту функцию следующим образом:

var street = ""
var locality = ""

// Get the street address from the coordinates
    func deocodedString() -> String {
        let geocoder = CLGeocoder()
        geocoder.reverseGeocodeLocation(location) { placemarks, error in
        if let placemark = placemarks?.first {
        self.street = placemark.name!
        self.locality = placemark.locality!
        let string = "\(self.street), \(self.locality)"
        return string
        }
    }
}

Я получаю ошибку: Неожиданное возвращаемое значение в void функции

неожиданное возвращаемое значение no void в функции void

Наконец, если я передаю информацию прямо в TextView внутри замыкания с использованием приведенного ниже кода, мой textView успешно обновляется:но я не могу отформатировать строки, что мне нужно сделать, чтобы они выглядели как инструкции по проектированию, которым я следую (так называемый жирный текст, обычный текст и несколько разных размеров текста):

CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in
    if let placemark = placemarks?.first {
        self.street = placemark.name!
        self.locality = placemark.locality!
        let string = "\(self.street), \(self.locality)"
        self.addressTextView.text = string
    }
}

Поэтому я не могу просто передать его с помощью метода textView.text = string.

Буду признателен за помощь ... Я искал StackOverFlow, youtube и другиеучебные заведения, но я не могу понять, что яssing, или почему мое объявление функции генерирует ошибку.За последние 24 часа я уже несколько раз уничтожал и переворачивал свой код, не получая независимую строку, к которой я могу применить форматирование, прежде чем передать ее в textView, и я не знаю, как еще подойти к нему.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

У меня была проблема с геокодером Google, чтобы обновить ярлык на экране карты.

Итак, сначала я создал

быстрое имя файла: GoogleAPI просто называйте его как хотите.

class GoogleAPI {

    static let sharedInstance = GoogleAPI()

    private init() { }

    var addressValue = ""

    public func geocoding(lat: Double, long: Double) {
        Alamofire.request("https://maps.googleapis.com/maps/api/geocode/json?latlng=\(lat),\(long)&key=YOUR_GOOGLE_KEY").responseJSON { (response) in
            if response.result.isSuccess {
                let dataJSON : JSON = JSON(response.result.value!)
                self.geocoding(json: dataJSON)
            } else {
                print("Error \(response.result.error!)")
            }
        }
    }

    fileprivate func geocoding(json: JSON) {
        let json = json["results"]
        let address = json[1]["formatted_address"].stringValue
        addressValue = address
        print("pin address \(addressValue)")
    }
}

Это вызов API для Google, чтобы получитьвсе из ответа и разбор единственной улицы.

После этого перейдите в View Controller с картой, где находится булавка, карта и т. Д.

Установите булавку, маркер для перетаскивания.[marker1.isDraggable = true]

Затем добавьте эту функцию

mapView (_ mapView: GMSMapView, didEndDragging marker: GMSMarker)

и добавьте вызов сверхувот так:

func mapView(_ mapView: GMSMapView, didEndDragging marker: GMSMarker) {
    GoogleAPI.sharedInstance.geocoding(lat: marker.position.latitude, long: marker.position.longitude)
    DispatchQueue.main.async {
        self.txtSearch.text = GoogleAPI.sharedInstance.addressValue
    }
}

txtSearch - это мое текстовое поле поиска.

да, я знаю, это можно сделать лучше, но не время.это работает

Swift 4.2

0 голосов
/ 29 мая 2018

При вызове этой функции reverseGeocodeLocation выполняется в фоновом потоке.Поэтому, если вы хотите вернуть адрес в этом методе, вы должны использовать Escapeing Closure .

    func getaddress(_ position:CLLocationCoordinate2D,completion:@escaping (String)->()) {
     let geocoder = CLGeocoder()
        geocoder.reverseGeocodeLocation(location) { placemarks, error in
        if let placemark = placemarks?.first {
        let street = placemark.name!
        let locality = placemark.locality!
        let string = "\(street), \(locality)"
        completion(string)
        }
    } 
    }

   self.getaddress(position.target) { address in
        print(address)
        self.addressTextView.text = address    
   }
...