Swift Direction请求不会在if语句中正确计算
问题描述:
我想计算用户当前位置到许多不同位置的距离,并将这些计算放入计算数组中。所以我可以对这个数组进行排序并找到最近的位置。最后,我想在用户体验上显示表视图顶部的最近位置。但我无法正确地将每个计算附加到“计算数组”中。请参阅我在代码末尾使用print()获得的输出。我在哪里做错了?感谢您的帮助。Swift Direction请求不会在if语句中正确计算
override func viewDidLoad() {
super.viewDidLoad()
visualEffect.isHidden = true
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
Calculate()
}
var closestDistanceIndex:Int = 0
func Calculate() {
// anlık lokasyona en yakın giriş hesaplaması
var calculations:[Double] = []
var distance:Double = 0.0
var i = 1
while i < (giselerGiris.count)
{
print("index \(i)")
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
let source1 = MKMapItem(placemark: MKPlacemark(
coordinate: CLLocationCoordinate2DMake(locValue.latitude, locValue.longitude),
addressDictionary: nil))
let destination1 = MKMapItem(placemark: MKPlacemark(
coordinate: CLLocationCoordinate2DMake(girisLatitude[i], girisLongtitude[i]),
addressDictionary: nil))
let directionsRequest = MKDirectionsRequest()
directionsRequest.source = source1
directionsRequest.destination = destination1
directionsRequest.transportType = .automobile
let directions = MKDirections(request: directionsRequest)
directions.calculate { (response, error) -> Void in
print("hata \(String(describing: error))")
distance = (response!.routes.first?.distance)!
print("distance is \(distance)")
calculations.append(distance)
}
print("distance \(i): \(distance)")
i += 1
}
let closestDistance = calculations.min()!
print("closest distance is \(closestDistance)")
closestDistanceIndex = calculations.index(of: closestDistance)!
print("closest distance index is \(closestDistanceIndex)")
}
我得到以下错误
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
此行中
let closestDistance = calculations.min()!
,这里是输出
index 1
distance 1: 0.0
index 2
distance 2: 0.0
index 3
distance 3: 0.0
index 4
distance 4: 0.0
index 5
distance 5: 0.0
index 6
distance 6: 0.0
index 7
distance 7: 0.0
index 8
distance 8: 0.0
index 9
distance 9: 0.0
index 10
distance 10: 0.0
index 11
distance 11: 0.0
index 12
distance 12: 0.0
index 13
distance 13: 0.0
index 14
distance 14: 0.0
index 15
distance 15: 0.0
index 16
distance 16: 0.0
index 17
distance 17: 0.0
index 18
distance 18: 0.0
index 19
distance 19: 0.0
fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)
答
问题是directions.request
是一个异步方法,因为它需要调用Apple的服务器来计算距离,并且在请求实际返回之前尝试使用它的值。另外请注意,大多数需要网络请求的MapKit
调用都有一个速率限制,所以如果您连续做20个呼叫,您可能会受到速率限制(即使Apple没有发布确切的数字,所以您不需要知道这是什么时候发生的)。
在使用它们的值之前,您需要等待所有方向请求完成执行。如果数组是空的,则Array.min()
返回nil
,这就是这种情况,因此也是错误。
答
基于输出,我没有看到这行输出:
print("distance is \(distance)")
这使我相信你的距离没有被追加到计算数组。
因此,在while循环结束时计算数组为空,当您尝试获取空数组的min()时,它将返回nil并强制解包,从而导致崩溃。
我会建议你在你将距离追加到计算数组的行上放置一个断点,看它是否正在执行。
如果是,则尝试在while循环结束时打印计算数组的值,并查看该点是否还有值。
这不提供问题的答案。一旦你有足够的[声誉](https://*.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://*.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/16902868) –