Как проверить равенство двух 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
}