Swift Direction Request不会在if语句中正确计算

时间:2017-08-01 21:59:18

标签: swift if-statement fatal-error optional-values mkdirection

我想计算从用户当前位置到许多不同位置的距离,并将这些计算放入计算数组中。所以我可以对这个数组进行排序并找到最近的位置。最后,我想在表格视图顶部显示最近的位置,以获得用户体验。但我不能正确地将每个计算附加到“计算数组”中。请查看我在代码末尾使用print()获得的输出。我哪里做错了?谢谢你的帮助。

   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) 

2 个答案:

答案 0 :(得分:0)

根据输出,我没有看到输出这一行:

print("distance is \(distance)")

这让我相信你的距离没有被附加到计算数组中。

因此,计算数组在while循环结束时为空,当您尝试获取空数组的min()时,它将返回nil并强制解包将导致崩溃。

我建议你在你将距离附加到计算数组的行上放一个断点,看看它是否正在被执行。

如果是,则尝试在while循环结束时打印出计算数组的值,并查看该点是否仍有值。

答案 1 :(得分:0)

问题是directions.request是一种异步方法,因为它需要调用Apple的服务器来计算距离,并且在请求实际返回之前尝试使用它的值。另请注意,大多数需要网络请求的MapKit次呼叫都有速率限制,因此如果您连续拨打20次电话,您可能会受到速率限制(即使Apple没有公布其确切数字,所以你不知道到底发生了什么。)

在使用其值之前,您需要等待所有方向请求完成执行。如果数组为空,则Array.min()返回nil,这就是这种情况,因此错误。