1

我写了这样的东西来计算 2 个点/位置之间的行驶距离。

方法实现:

第一类:

static func calculateDistance(_ location1 : CLLocationCoordinate2D, location2: CLLocationCoordinate2D, completion: @escaping (_ distance: CLLocationDistance?) -> ()) {

    let start = MKMapItem(placemark: MKPlacemark(coordinate: location1))
    let destination = MKMapItem(placemark: MKPlacemark(coordinate: location2))
    let request = MKDirectionsRequest()
    request.source = start
    request.destination = destination
    request.requestsAlternateRoutes = false
    let direction = MKDirections(request: request)
    var distanceInMiles: CLLocationDistance?

    direction.calculate { (response, error) in
        if let response = response, let route = response.routes.first {
            distanceInMiles = route.distance * 0.000621371
            completion(distanceInMiles)
        }
    }
}

使用问题

第 2 类:如何访问不同类中的距离值?例如,我有一个参数化的 init,其中第三个参数“dist”的类型为 CLLocationDistance。我想要实现的是从Class1 的calculateDistance方法访问距离值

let assigningDistValue = Class1(coordinate: location, secondParam: paramValue, dist:finalDistance!)

我已经阅读了与此问题相关的所有建议解决方案,但没有任何帮助。

4

1 回答 1

1

finalDistance 关闭后无法访问,因为代码按以下顺序运行:

var finalDistance: CLLocationDistance?
// 1:
let calculatedDistance = Class1.calculateDistance(location, location2: secondlocation) { (distance) in
    // 3:
    guard let distanceInMiles = distance else { return }
    print("This is to print distance in miles", distanceInMiles)
    finalDistance = calculatedDistance
}
// 2:
let assigningDistValue = Class1(coordinate: location, secondParam: paramValue, dist:finalDistance!)

只需将该let行移动到异步材料的末尾:

let calculatedDistance = Class1.calculateDistance(location, location2: secondlocation) { (distance) in
    guard let distanceInMiles = distance else { return }
    print("This is to print distance in miles", distanceInMiles)
    finalDistance = calculatedDistance
    // put it here
    let assigningDistValue = Class1(coordinate: location, secondParam: paramValue, dist:finalDistance!) {
        // and on we go...
    }
}

或者,使用另一个完成块,就像您在显示的第一个代码中所做的那样。这在第一个代码中是正确的,但是在第二个代码中,所有关于异步意味着什么的知识似乎都被遗忘了。

于 2018-09-28T01:44:27.453 回答