После получения расстояния вождения между двумя точками с помощью 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...
    }
}

Или же используйте другой блок завершения, который вы сделали в первом показанном вами коде. Все это правильно в первом коде, но затем во втором коде все эти знания о том, что означает асинхронный, кажутся забытыми.

Другие вопросы по тегам