【问题标题】:After deriving the driving distance between two points using MKDirections (Swift 4) how to access the distance value outside the closure? [duplicate]使用 MKDirections (Swift 4) 导出两点之间的行驶距离后,如何访问闭包外的距离值? [复制]
【发布时间】:2018-09-28 01:28:22
【问题描述】:

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

方法实现:

第 1 类:

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!)

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

【问题讨论】:

  • “如何访问不同类中的距离值”。与您在第一个代码中所做的相同。正如我在回答中所说,设置此方法以接受完成处理程序。
  • 知道了,谢谢。这解决了我的问题。

标签: ios swift closures mkdirection


【解决方案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...
    }
}

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

【讨论】:

  • 谢谢马特。按照建议的解决方案解决此问题。我赞成这个答案。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2019-07-26
  • 2012-08-06
  • 2015-05-14
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多