返回类型Nill

时间:2017-06-12 06:31:22

标签: ios swift xcode

 func getAddressFromLatLon() {



    var locManager = CLLocationManager()
    locManager.requestWhenInUseAuthorization()
    var currentLocation = CLLocation()

    if( CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
        CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorized){

        currentLocation = locManager.location!

    }




    var center : CLLocationCoordinate2D = CLLocationCoordinate2D()
    let lat: Double = Double(currentLocation.coordinate.latitude)
    //21.228124
    let lon: Double = Double(currentLocation.coordinate.longitude)
    //72.833770
    let ceo: CLGeocoder = CLGeocoder()
    center.latitude = lat
    center.longitude = lon

    let geoCoder = CLGeocoder()
    var placemark: AnyObject
    var error: NSError
    geoCoder.reverseGeocodeLocation(locManager.location!, completionHandler: { (placemark, error) -> Void in
        if error != nil {
            print("Error: \(error?.localizedDescription)")
            return
        }
        if (placemark?.count)! > 0 {
            let pm = (placemark?[0])! as CLPlacemark
            //self.addressString = pm.locality! + pm.country!
            let adress = pm.locality! + " " + pm.country!

            print(adress)
        } else {
            print("Error with data")
        }
    })



}

对这个非常基本的问题感到抱歉。我是一个相当新的快速,我试图扭转地理编码的经度和经度。我试图从反向地理编码返回地址,但它似乎返回零。有问题的函数是getAddressFromLatLon(),我尝试添加一个返回类型,但它返回nil。当我在函数本身打印时,会打印正确的值,但由于某种原因,我很难让地址返回,所以我可以将它传递给其他类/函数。

2 个答案:

答案 0 :(得分:0)

您需要保留从reserver地理编码器获得的值,只需要使用它。

  geoCoder.reverseGeocodeLocation(locManager.location!, completionHandler: { (placemark, error) -> Void in
            if error != nil {
                print("Error: \(error?.localizedDescription)")
                return
            }
            if (placemark?.count)! > 0 {
                let pm = (placemark?[0])! as CLPlacemark
                //self.addressString = pm.locality! + pm.country!
                let adress = pm.locality! + " " + pm.country!

                // Store value into global object and you can use it...
               // Another option, you can call one function and do necessary steps in it
                mainLocality = pm.locality
                mainCountry - pm.country       
                updateGeoLocation() // Call funcation

                print(adress)
 } else {
            print("Error with data")
        }
    })


func updateGeoLocation(){
     // You can use both object at here
     //    mainLocality
     //    mainCountry
     // Do your stuff

}

答案 1 :(得分:0)

您需要在ViewDidLoad中初始化CLLocation对象并在其中获取位置协调方法委托方法

为当前位置确定变量

var currentLocation : CLLocation

在ViewDidLoad

 var locManager = CLLocationManager()

    locationManager.delegate = self;
            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            // ask permission - NOT NECESSARY IF YOU ALREADY ADDED NSLocationAlwaysUsageDescription IT UP INFO.PLIST
            locationManager.requestAlwaysAuthorization()
            // when in use foreground
            locationManager.requestWhenInUseAuthorization()
            locationManager.startUpdatingLocation()

CLLocation的代表

 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        // Get first location item returned from locations array
        currentLocation = locations[0]
        self.getAddressFromLatLon() // you can call here or whenever you want
    }

您的方法如下

func getAddressFromLatLon() {

    var center : CLLocationCoordinate2D = CLLocationCoordinate2D()
    let lat: Double = Double(currentLocation.coordinate.latitude)
    //21.228124
    let lon: Double = Double(currentLocation.coordinate.longitude)
    //72.833770
    let ceo: CLGeocoder = CLGeocoder()
    center.latitude = lat
    center.longitude = lon

    let geoCoder = CLGeocoder()
    var placemark: AnyObject
    var error: NSError
    geoCoder.reverseGeocodeLocation(locManager.location!, completionHandler: { (placemark, error) -> Void in
        if error != nil {
            print("Error: \(error?.localizedDescription)")
            return
        }
        if (placemark?.count)! > 0 {
            let pm = (placemark?[0])! as CLPlacemark
            //self.addressString = pm.locality! + pm.country!
            let adress = pm.locality! + " " + pm.country!

            print(adress)
        } else {
            print("Error with data")
        }
    })



}