That link from @Claude31 is very, very well worth reading. Then some further thoughts on this:
completionHandler: @escaping (Double) -> Void
It’s better to use type CLLocationDegrees rather than Double. They are actually the same (via typealias) but using CLLocationDegrees is much more clear to someone reading the code. But with that said, I’d suggest you change to result type to CLLocationCoordinate2D (lat + long) or even CLLocation (coordinates plus other information). Why? Because...
Your other post mentions you have an equivalent getLongFromAddress method. That’s not a good idea if you actually need both coordinates, since both call geocodeAddressFromString which is async and relatively slow. Instead you should have a single (say) getLocationFromAddress to get both the latitude and longitude together. If in any any specific call you need only one of them, then that’s fine.
So if you changed the completion handler to this...
completionHandler: @escaping (CLLocationCoordinate2D) -> Void
...there’s still a problem: this doesn’t handle any error from the underlying geocodeAddressFromString call. The early return means the caller of your method never finds out if there was an error and can’t do anything about it. Any completion handler like this should report both success (with a result) and failure (with an error). If you follow the style used by geocodeAddressFromString then your completion handler would look like this:
completionHandler: @escaping (CLLocationCoordinate2D?, Error?) -> Void
That’s fine, though there is a newer convention for implementing this sort of “either result or error” completion handler, using the Result type:
completionHandler: @escaping (Result<CLLocationCoordinate2D, Error>) -> Void
And going further, as Claude said you can convert all of this to the modern async / await pattern, but I think that’s a topic for a bit later.