如何访问块外的变量?

时间:2015-02-18 13:45:58

标签: ios xcode swift ios8

以下代码无效。

  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。为什么会这样?我非常感谢你。

2 个答案:

答案 0 :(得分:2)

这是因为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

答案 1 :(得分:0)

您的代码的问题是块代码:

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

将在稍后执行。

表示当前return语句将始终返回未初始化的值。 如果您要在块中初始化此var,则应将其设为对象的property