如何访问外部块变量

如何访问外部块变量

This question already has an answer here:
AlamoFire GET api request not working as expected

(1个答案)


5年前关闭。




以下代码无法正常运行。
  func convertToStreet(location:CLLocationCoordinate2D) -> CLPlacemark {

    var tempLocation = CLLocation(latitude: location.latitude, longitude: location.longitude)

    var temPlacemark:CLPlacemark?

    CLGeocoder().reverseGeocodeLocation(tempLocation, completionHandler: {(placemarks, error) in

        temPlacemark = (placemarks[0] as CLPlacemark)
        println(temPlacemark!.thoroughfare)

    })

    return temPlacemark!
}

完成处理程序中的Println可以正常工作,但是temPlacemark的值在代码末尾为nil。为什么会这样呢?我非常感谢你。

最佳答案

这是因为completionHandler是异步调用的。为此,您应该在自定义函数中有一个回调块,以从CLGeocoder获得值后返回该值。

像这样:

func convertToStreet(coordinate: CLLocationCoordinate2D, completionHandler: (placemark: CLPlacemark!, error: NSError!) -> Void) {
    let tempLocation = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)

    CLGeocoder().reverseGeocodeLocation(tempLocation) { placemarks, error in
        completionHandler(placemark: placemarks?.first as CLPlacemark?, error: error)
    }
}

然后,您可以这样称呼它:
convertToStreet(location.coordinate) { placemark, error in
    if placemark != nil {
        // use `placemark` here
        println(placemark.thoroughfare)
    } else {
        println(error)
    }
}

// but don't use `placemark` here

关于ios - 如何访问外部块变量? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28585188/

10-11 18:04