如何测试两个CLLocations的相等性

时间:2011-06-30 03:45:22

标签: objective-c xcode iphone-4

我遇到了isEqual的问题:

代码:

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

currentanchor和currentbusiness.getCllocation是位置

但如果它们是相同的,为什么函数b被调用?我的代码有问题吗?

4 个答案:

答案 0 :(得分:27)

我假设这两个对象都是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;
}

答案 1 :(得分: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

我很惊讶我是那个问这个问题的人:)

答案 2 :(得分:0)

isEqual只检查对象而不是其内容。您需要创建自己的方法来访问对象的变量,并使用==运算符检查它们是否相等。

答案 3 :(得分:0)

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
}