Функцията за координати на iOS Swift връща нула

Работя върху функция за преобразуване на град (низ) в координати. Въпреки това, когато извикам функцията, получавам "(0.0, 0.0)" като резултат. Трябва да са географската ширина и дължина.

Моля, помогнете ми. Благодаря!

Това е функцията

func getCoordinates(huidigeLocatie: String) -> (lat: CLLocationDegrees, long: CLLocationDegrees) {

    var lat:CLLocationDegrees
    var long:CLLocationDegrees

    var geocoderHuidigeLocatie = CLGeocoder()

    geocoderHuidigeLocatie.geocodeAddressString(huidigeLocatie, completionHandler:
        {(placemarks: [AnyObject]!, error: NSError!) in

            if error != nil {

                println("Geocode failed with error: \(error.localizedDescription)")

            } else if placemarks.count > 0 {

                let placemark = placemarks[0] as CLPlacemark
                let location = placemark.location

                var lat = location.coordinate.latitude
                var long = location.coordinate.longitude

            }
    })

    return (lat: CLLocationDegrees(), long: CLLocationDegrees())
}

person Nick Groeneveld    schedule 04.01.2015    source източник
comment
Предполагам, че ако регистрирате lat и long в else if теста, той работи? Тогава проблемът ви може да е, защото е асинхронен (както е посочено в документа).   -  person Larme    schedule 04.01.2015
comment
Отстранявах грешки в него и се оказа, че дори не изпълнява командата if. Не знам защо е така. Леонардо, как да поправя това?   -  person Nick Groeneveld    schedule 04.01.2015


Отговори (2)


Тук има два проблема:

  1. Искате да върнете действителните lat и long променливи, а не CLLocationDegrees().

  2. По-фин проблем е, че извиквате функция, която връща своите резултати асинхронно, така че не можете да върнете стойностите веднага. Вместо това можете да използвате свой собствен модел completionHandler.

Например:

func getCoordinates(huidigeLocatie: String, completionHandler: (lat: CLLocationDegrees!, long: CLLocationDegrees!, error: NSError?) -> ()) -> Void {

    var lat:CLLocationDegrees
    var long:CLLocationDegrees

    var geocoderHuidigeLocatie = CLGeocoder()

    geocoderHuidigeLocatie.geocodeAddressString(huidigeLocatie) { (placemarks: [AnyObject]!, error: NSError!) in

        if error != nil {

            println("Geocode failed with error: \(error.localizedDescription)")

            completionHandler(lat: nil, long: nil, error: error)

        } else if placemarks.count > 0 {

            let placemark = placemarks[0] as CLPlacemark
            let location = placemark.location

            let lat = location.coordinate.latitude
            let long = location.coordinate.longitude

            completionHandler(lat: lat, long: long, error: nil)
        }
    }
}

И бихте го нарекли така:

getCoordinates(string) { lat, long, error in
    if error != nil { 
        // handle the error here 
    } else {
        // use lat, long here
    }
}

// but not here
person Rob    schedule 04.01.2015

Трябва да return (lat: lat, long: long).

person return true    schedule 04.01.2015
comment
Да, това решава проблема с връщането на правилните променливи. Но има по-дълбок проблем, че той се опитва незабавно да върне данни, които ще бъдат получени само асинхронно. Вместо това OP трябва да използва модел на затваряне на манипулатора за завършване. - person Rob; 05.01.2015
comment
@Rob Току-що потърсих в Google, за да проверя и моделът на затваряне на манипулатора за завършване не е стандартна терминология... Имате предвид поставянето на оператора за връщане в блока? - person Lyndsey Scott; 05.01.2015
comment
Не, нямам предвид това. Вижте CLGeocoder метода geocodeAddressString. Той има параметър completionHandler, който се извиква асинхронно (т.е. функцията се връща незабавно, но блокът/затварянето с данните за геокод се извиква по-късно, когато търсенето на адрес е направено). трябва да използвате същия модел във вашия собствен код. - person Rob; 05.01.2015