Главная проблема здесь - просто отсутствующая закрывающая скобка, которая объясняет, почему ОП получил много ошибок. Кстати, присвоение имени CLLocationCoordinate2D вводит в заблуждение, и вы также забыли упомянуть, что при вызове асинхронного метода OP необходимо вернуться к основному потоку для обновления пользовательского интерфейса.

ел несколько вопросов по SO, но все они устарели в Swift 2. Я получил эту функцию с веб-сайта Apple для преобразования названия города в широту и долготу, но я не уверен, что функция возвратит (так как после оператора return ничего нет ) и что я должен пройти. Кто-нибудь объяснит мне это или покажет мне, как им пользоваться, пожалуйста.

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?)
    }
}

Ответы на вопрос(2)

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

getCoordinate(addressString: someString) { coordinate, error in
  if error != nil {
    //display error
    return
  } else {
    //at this point `coordinate ` contains a valid coordinate. 
    //Put your code to do something with it here
    print("resulting coordinate = (\(coordinate.latitude),\(coordinate.longitude))")
  }
}

Обратите внимание, что для Swift 3 ваша функция будет работать, а не возвращать либо результат, либо ошибку.

 codeDojo12 нояб. 2017 г., 03:59
Я действительно ценю то, что вы сделали, но что, если я просто хочу передать название города, чтобы получить местоположение, так как я не уверен, как использовать его для передачи блока кода. Не могли бы вы показать мне точный код, который мне нужно использовать, и я был бы признателен.
 Leo Dabus12 нояб. 2017 г., 04:56
Главная проблема здесь - просто отсутствующая закрывающая скобка, которая объясняет, почему ОП получил много ошибок. Кстати, присвоение имени CLLocationCoordinate2D вводит в заблуждение, и вы также забыли упомянуть, что при вызове асинхронного метода OP необходимо вернуться к основному потоку для обновления пользовательского интерфейса.
 codeDojo12 нояб. 2017 г., 04:01
Кусок кода, который вы написали, я не был уверен, что это для объяснения или реальной функции, я пытался вставить его в свой код, и я получил много ошибок.
Решение Вопроса

Вы можете сделать это следующим образом:

import CoreLocation

func getCoordinateFrom(address: String, completion: @escaping(_ coordinate: CLLocationCoordinate2D?, _ error: Error?) -> () ) {
    CLGeocoder().geocodeAddressString(address) { completion($0?.first?.location?.coordinate, $1) }
}

Использование:

let address = "Rio de Janeiro, Brazil"

getCoordinateFrom(address: address) { coordinate, error in
    guard let coordinate = coordinate, error == nil else { return }
    // don't forget to update the UI from the main thread
    DispatchQueue.main.async {
        print(address, "Location:", coordinate) // Rio de Janeiro, Brazil Location: CLLocationCoordinate2D(latitude: -22.9108638, longitude: -43.2045436)
    }

}

Ваш ответ на вопрос