我遇到了isEqual的问题:
代码:
if (currentAnchor isEqual:currentBusiness.getCllLocation))
{
do a;
}
else
{
do b;
}
currentanchor和currentbusiness.getCllocation是位置
但如果它们是相同的,为什么函数b被调用?我的代码有问题吗?
答案 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
}