Пожалуйста, используйте вкладки, чтобы сделать ваш код более читабельным.
В любом случае geocoder.geocodeAddressString(address)
- это метод с обратным вызовом, и в этом методе обратного вызова у вас есть метка. Ваш возврат не будет ждать этого обратного вызова, так как для расчета координат потребуется время, поэтому он возвращает 0.0, которое вы установили в начале. в комментарии:
CLGeocoder()
функция geocodeAddressString
фактически имеет 2 параметра: адрес и так называемый обратный вызов. Обратный вызов - это просто метод, вызываемый, когда задача (в данном случае вычисление метки) завершается. Swift позволяет вам писать обратный вызов в «быстром» синтаксисе, но на самом деле это выглядит как
geocoder.geocodeAddressString(address, callAfterFinishGeocoding)
func callAfterFinishGeocoding(_ placemark: Placemark) {
// do stuff with placemark
}
, как вы можете видеть, мы передаем функции геокодирования еще одну функцию, которая будет вызвана после завершения. Параметры callAfterFinishGeocoding
определены в geocodeAddressString
. Это будет выглядеть примерно так:
callback: @escaping (_ placeMark: Placemark) -> Void
Это будет означать, что обратный вызов должен быть функцией, принимающей метку и возвращающей Void. Перейдите к определению метода и посмотрите, какую функцию он хочет использовать в качестве параметра.
также читайте подробнее здесь: { ссылка }