Поток 1: Неустранимая ошибка: Индекс выходит за пределы диапазона. Не получая значения из массива в swift, консоль показывает, что они не являются пустыми массивами

Я получаю:

Поток 1: Фатальная ошибка: Индекс вне диапазона

когда я вызываю функцию.

У меня есть функция, которая должна выполнять сравнение между значениями, хранящимися в 2 массивах CLLocation2D. Первый,trackingRouteArray, получает CLLocation2D, добавляемый мониторингом положения пользователя. Второй, alertNotificationArray, добавляется двойными касаниями, которые хранят CLLocation2D.

У меня есть два счетчика trackingCoordinatesArrayPositionа также alertNotificationArrayPosition которые используются для увеличения позиции массива для получения значений.

Теперь моя проблема в том, что trackingRouteArray имеет значение, когда я ссылаюсь на его позиции, но alertNotificationArrayне делает. В консоли я печатаю оба массива, и они оба заполнены значениями.

Вот код:

func checkAlerts() {
    while trackingCoordinatesArrayPosition != ( (trackingCoordinatesArray.count) - 1) {
        let trackingLatitude = trackingCoordinatesArray[trackingCoordinatesArrayPosition].latitude
        let trackingLongitude = trackingCoordinatesArray[trackingCoordinatesArrayPosition].longitude
        let alertLatitude = alertNotificationArray[alertNotificationArrayPosition].latitude
        let alertLongitude = alertNotificationArray[alertNotificationArrayPosition].longitude

        if trackingLatitude == alertLatitude && trackingLongitude == alertLongitude {
            // do something
            print( "found problem")
        }
        else if alertNotificationArrayPosition < alertNotificationArray.count {
            alertNotificationArrayPosition = alertNotificationArrayPosition + 1
        }
        else if  alertNotificationArrayPosition == alertNotificationArray.count {
            trackingCoordinatesArrayPosition = ( trackingCoordinatesArrayPosition + 1)
            alertNotificationArrayPosition = 0
        }
    }
}

Я получаю ошибку на let alertLatitude = alertNotificationArray[alertNotificationArrayPosition].latitudeлиния

Это распечатки с консоли:

отслеживание остановлено
предупреждает координаты [__C.CLLocationCoordinate2D(широта: 37,333775436275886, долгота: -122,02368602396592), __C.CLLocationCoordinate2D (широта: +37,332980802736785, долгота: -122,02355882939459), __C.CLLocationCoordinate2D (широта: +37,333891009356435, долгота: -122,0235224889466), __C.CLLocationCoordinate2D (широта: +37,33415106952107, долгота: -122,02355883066487), __C.CLLocationCoordinate2D (широта: 37,334338890591638, долгота: -122,02332261163552), __C.CLLocationCoordinate2D (широта: 37,334598949139817, долгота: -122,02328627075829), __C.CLLocationCoordinate2D (широта: +37,335696975135136, долгота: -122,0236315182422)] координаты возможных маршрутов [__C.CLLocationCoordinate2D(широта: 37,333153109999998, долгота: -122,02360022000001), __C.CLLocationCoordinate2D (широта: +37,333184799999998, долгота: -122,02360543), __C.CLLocationCoordinate2D (широта: +37,333217210000001, долгота: -122,02360829), __C. CLLocationCoordinate2D (широта: 37,333247679999999, долгота: -1 22,02360903), __C.CLLocationCoordinate2D (широта: +37,333278159999999, долгота: -122,02360912), __C.CLLocationCoordinate2D (широта: 37,333308330000001, долгота: -122,02360862), __C.CLLocationCoordinate2D (широта: 37,333339840000001, долгота: -122,02360667000001), __C.CLLocationCoordinate2D (широта: 37,333372369999999, долгота: -122,02360458), __C.CLLocationCoordinate2D (широта: 37,333404880000003, долгота: -122,02360226), __C.CLLocationCoordinate2D (широта: 37,333437250000003, долгота: -122,02360114), __C.CLLocationCoordinate2D (широта: 37,333469319999999, долгота: -122,02360106), __C.CLLocationCoordinate2D (широта: +37,333500979999997, долгота: -122,0236012), __C.CLLocationCoordinate2D (широта: +37,333533869999997, долгота: -122,02360059999999), __C.CLLocationCoordinate2D (широта: 37,333567180000003, долгота: -122,02360006000001), __C.CLLocationCoordinate2D (широта: +37,333599149999998, долгота: -122.02359964999999), __C.CLLocationCoordinate2D (широта: 37.333630999999997, долгота: -122.0236005), __С, __C.CLLocationCoordinate2D (широта: +37,333768640000002, долгота: -122,0235964), __C.CLLocationCoordinate2D (широта: +37,333807470000004, долгота: -122,02359255), __C.CLLocationCoordinate2D (широта: 37,333850239999997, долгота: -122,02359082), __C.CLLocationCoordinate2D (широта: +37,333894520000001, долгота: -122.02358845000001), __C.CLLocationCoordinate2D (широта: 37.333937650000003, долгота: -122.02358579), __C.CLLocationCoordinate2D (широта: 37.333980240000002, долгота: -12224020000000000) 3500.CLLocationCoordinate2D (широта: 37.334073750000002, долгота: -122.02357465), __C.CLLocationCoordinate2D (la titude: +37,334120370000001, долгота: -122,0235716), __C.CLLocationCoordinate2D (широта: 37,334169469999999, долгота: -122,02356758000001), __C.CLLocationCoordinate2D (широта: 37,334220510000002, долгота: -122,02356580999999), __C.CLLocationCoordinate2D (широта: +37,334273039999999, долгота: -122,02356597000001), __С 37.334504440000003, долгота: -122.02357289), __C.CLLocationCoordinate2D (широта: 37.334565410000003, долгота: -122.02357538), __C.CLLocationCoordinate2D (широта: 37.33462555002: 3500): 2002- 2002: 2) 352, 2002): широта долготы: долгота широты __C.CLLocationCoordinate2D (широта: 37.334747299999997, долгота: -122.02357773), __С, долгота: -122.023573), __C.CLLocationCoordinate2D (широта: 37.335095870000004, долгота: -122.02356672000001), __C.CLLocationCoordinate2D (широта: 37.335175319999998, долгота: -122.022502: 352) 35005025250101).CLLocationCoordinate2D (широта: +37,335346260000001, долгота: -122,02352918), __C.CLLocationCoordinate2D (широта: 37,335435189999998, долгота: -122,02351114), __C.CLLocationCoordinate2D (широта: +37,335526700000003, долгота: -122,02348929), __C.CLLocationCoordinate2D (широта: +37,335615359999998, долгота: -122.02346115), __C.CLLocationCoordinate2D (широта: 37.335705070000003, долгота: -122.0234 2901999999), __С: 37,336079929999997, долгота: -122,02329487999999), __C.CLLocationCoordinate2D (широта: 37,336179360000003, долгота: -122,02327117), __C.CLLocationCoordinate2D (широта: 37,336281159999999, долгота: -122,02325363999999), __C.CLLocationCoordinate2D (широта: 37,3363838, долгота: -122,02324118999999), __C.CLLocationCoordinate2D (широта: 37.336481880000001, долгота: -122.02323437), __C.CLLocationCoordinate2D (широта: 37.336578070000002, долгота: -122.02323232000001), __C.CLLocation99992999969929999699599299599699599299699699699299699299699599699299699599599599699699299 (())99992999999996992995995995992995995992995992995992996995996995996995996992995996: координаты: 399999999999999999999999999999999999999999999999999999999999999999999999999999900
(Lldb)`

а также

 
self    fix_it_mapView.MapViewController    0x00007fb37980b000
trackingLatitude    CLLocationDegrees   37.333153109999998
trackingLongitude   CLLocationDegrees   -122.02360022000001
alertLatitude   CLLocationDegrees   
alertLongitude  CLLocationDegrees

Функция откуда checkAlerts() Позволяет делать вызовы, печатает массивы перед вызовом, но кажется, что вызов выполнялся раньше, и я просто не могу выяснить, является ли это опечаткой или нет.

func stopTracking() {
    locationManager.stopUpdatingLocation()
    let duration = daysLasted(start: dateStart, end: Date())
    print("tracking stopped")
    self.dataReceived = "bici rubata"

    self.endTrackingPoint.coordinate = (locationManager.location?.coordinate)!  // gets courrent user location and store it into end tracking point
    self.trackingRoute.append(self.endTrackingPoint)                            // append end poit to route array
    mapView.showAnnotations(trackingRoute, animated: true)  // shows start and end ponits only
    drawRoutePolyline()  //draw route
    print("alerts coordinates are\(alertNotificationArray)")
    print("route coordinates are\(trackingCoordinatesArray)")
    checkAlerts()
} 

1 ответ

Решение

Приведенный ниже код, вероятно, является проблемой, поскольку он позволяет alertNotificationArrayPosition подняться, чтобы быть равным alertNotificationArray.count что будет означать индекс вне диапазона ошибки,

 else if alertNotificationArrayPosition < alertNotificationArray.count {
    alertNotificationArrayPosition = alertNotificationArrayPosition + 1
 }

Я также думаю, что условие while выглядит очень странно, когда вы используете != скорее, чем < или же <=

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