【问题标题】:How do I test the equality of two CLLocations如何测试两个 CLLocations 的相等性
【发布时间】:2011-06-30 03:45:22
【问题描述】:

我遇到了 isEqual 的问题:

代码:

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

currentanchor 和 currentbusiness.getCllocation 是位置

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

【问题讨论】:

    标签: objective-c xcode iphone-4


    【解决方案1】:

    我假设这两个对象都是CLLocation 类型,基于getClLocation 的名称。

    CLLocation 对其isEqual: 方法的作用没有任何规范,因此它可能只是继承了NSObject 的实现,它只是比较对象的指针。如果您有两个具有相同数据的不同对象,那么isEqual: 实现将返回NO。如果你有两个不同的对象,只是位置略有不同,它们肯定不会相等。

    在比较位置对象时,您可能不需要isEqual:。相反,您可能希望在CLLocation 上使用distanceFromLocation: 方法。这样的东西会更好:

    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
      

      我很惊讶我会问这个问题:)

      【讨论】:

      • 我建议将other 声明为id 以安全实施
      • 在坐标上简单地测试相等性并返回 super 最有可能更便宜。 self.coordinate.latitude == other.coordinate.latitude &amp;&amp; self.coordinate.longitude == other.coordinate.longitude
      • 您正在覆盖类别中的方法。这是一种不好的做法。您可能会得到此方法的未指定行为。根据苹果文档“如果在一个类别中声明的方法的名称与原始类中的方法相同,或者同一类(甚至超类)上的另一个类别中的方法,则行为未定义至方法实现在运行时使用。如果您在自己的类中使用类别,这不太可能成为问题,但在使用类别将方法添加到标准 Cocoa 或 Cocoa Touch 类时可能会导致问题。"
      • 我尝试使用== 0,我想知道为什么选择的答案是使用“2.0”阈值。
      【解决方案3】:

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

      【讨论】:

      • 这不是真的,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
      }
      

      【讨论】:

        最近更新 更多