Search code examples
swiftmapkitclgeocoder

How make function of returning address, but not only getting address?


I'll make function of returning address String. But below function return empty String of "".

How make return address function?

    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"

Solution

  • yes, this function always return empty string, coz CLGeocoder().reverseGeocodeLocation(location) take time to get address from Location and at same time your return str! also execute so you get empty string.

    use closure to get address from location.

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

    Usage

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