Как сделать функцию возврата адреса, а не только получения адреса? - PullRequest
0 голосов
/ 27 января 2020

Я сделаю функцию возврата адреса String. Но ниже функция возвращает пустую строку "".

Как сделать функцию обратного адреса?

    let defaultLocation = CLLocation(latitude: 35.17944, longitude: 129.07556)

    func convertToPlaceMark(_ location: CLLocation, data: Any?) -> String {
            var str: String? = ""
        CLGeocoder().reverseGeocodeLocation(location) {
               places,err in 

               if err != nil {
                  print("geocoder error")
                  return
               }
               let placeMark1: CLPlacemark? = places!.last
               if placeMark1 != nil {
                    str = placeMark1?.name     // "1001 Jungang-daero\n" <--- I need function that return this value
                    print(str!)
                }
          }
         return str!
     }

     print(convertToPlaceMark(defaultLocation, data: nil)) // "\n"

1 Ответ

1 голос
/ 27 января 2020

да, эта функция всегда возвращает пустую строку, потому что CLGeocoder().reverseGeocodeLocation(location) занимает время, чтобы получить адрес из Location, и в то же время ваш return str! также выполняется, чтобы вы получили пустую строку.

используйте замыкание для получения адреса с местоположения.

func convertToPlaceMark(_ location: CLLocation, _ handler: @escaping ((String?) -> Void)) {

       CLGeocoder().reverseGeocodeLocation(location) {
           places,err in

           if err != nil {
               print("geocoder error")
               handler(nil)
               return
           }
           let placeMark1: CLPlacemark? = places!.last
           handler(placeMark1?.name)
       }
   }

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

convertToPlaceMark(location) { (address) in
        if let address = address {
            print(address)
        }
    }
...