После получения расстояния вождения между двумя точками с помощью MKDirections (Swift 4), как получить доступ к значению расстояния вне затвора?
Я написал что-то вроде этого, чтобы рассчитать расстояние между двумя точками / местами.
Реализация метода:
Класс 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. То, что я пытаюсь достичь, это получить доступ к значению расстояния из метода CalculateDistance Class 1
let assigningDistValue = Class1(coordinate: location, secondParam: paramValue, dist:finalDistance!)
Я в значительной степени прочитал все предложенные решения, связанные с этой проблемой, и ничто не помогло.
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...
}
}
Или же используйте другой блок завершения, который вы сделали в первом показанном вами коде. Все это правильно в первом коде, но затем во втором коде все эти знания о том, что означает асинхронный, кажутся забытыми.