Как проверить равенство двух CLLocations

У меня проблема с isEqual:

Код:

 if (currentAnchor isEqual:currentBusiness.getCllLocation))
    {
        do a;
    }
    else
    {
        do b;
    }

текущие и текущие события .getClocation - это местоположения

Но если они одинаковы, почему называется функция b? Что-то не так с моим кодом?

Ответ 1

Я предполагаю, что оба этих объекта имеют тип CLLocation, основанный на имени getClLocation.

CLLocation не имеет какой-либо спецификации того, что делает его метод isEqual:, поэтому он скорее всего наследует реализацию NSObject, которая просто сравнивает указатели объектов. Если у вас есть два разных объекта с одинаковыми данными, реализация isEqual: вернет NO. И если у вас есть два разных объекта с небольшим изменением местоположения, они определенно не будут равны.

Вероятно, вы не хотите isEqual: при сравнении объектов местоположения. Скорее всего, вы, вероятно, захотите использовать метод distanceFromLocation: на CLLocation. Что-то вроде этого было бы лучше:

CLLocationDistance distanceThreshold = 2.0; // in meters
if ([currentAnchor distanceFromLocation:currentBusiness.getCllLocation] < distanceThreshold)
{
  do a;
}
else
{
  do b;
}

Ответ 2

Прошло некоторое время.

То, что я сделал, похоже на BJ Homer. Я просто добавляю это.

@interface CLLocation  (equal)
- (BOOL)isEqual:(CLLocation *)other;
@end

@implementation CLLocation  (equal)

- (BOOL)isEqual:(CLLocation *)other {


    if ([self distanceFromLocation:other] ==0)
    {
        return true;
    }
    return false;
}
@end

Я был удивлен, что я задавал этот вопрос:)

Ответ 3

isEqual просто проверьте только объекты, а не их содержимое. вам необходимо создать свой собственный метод, когда вы обращаетесь к переменным объекта и проверяете их на равенство с помощью оператора ==.

Ответ 4

Версия Swift 4.0:

let distanceThreshold = 2.0 // meters
if location.distance(from: CLLocation.init(latitude: annotation.coordinate.latitude,
                                           longitude: annotation.coordinate.longitude)) < distanceThreshold
{ 
    // do a
} else {
    // do b
}