【问题标题】:using CLLocation objects as keys in dictionary使用 CLLocation 对象作为字典中的键
【发布时间】:2011-10-09 22:24:59
【问题描述】:

是否可以使用 CLLocation 对象作为字典中的键?当我尝试这个时,[dictionary objectForKey: clLocationObj] 总是返回 nil,即使已经插入了完全相同的纬度和经度的 CLLocation 键。我可能做错了什么?

       for (Location *location in someArray) {
               CLLocation *locationKey = [[CLLocation alloc] initWithLatitude:[location.latitude doubleValue] longitude:[location.longtitude doubleValue]];
               LocationAnnotation *annotationAtLocation = [self.uniqueLocations objectForKey:locationKey];
               if (annotationAtLocation == nil)
                    NSLog(@"this is always nil");
       }

我从调试中得知,someArray中有多个经纬度相同的Location对象。

【问题讨论】:

    标签: objective-c ios4 mapkit core-location


    【解决方案1】:

    CLLocation 似乎没有覆盖isEqual 来执行实际的内容比较,而是根据对象身份比较相等性。因此,不明智将其用作字典中的键,除非您始终使用完全相同的对象访问它。

    您在评论中描述的解决方案在许多情况下都是很好的解决方法:

    我最终将 CLLocationCoordinate2D 对象转换为 NSValue 并使用 作为字典的键。

    【讨论】:

      【解决方案2】:

      MapKit 框架中NSValue 上有NSValueMapKitGeometryExtensions 类别

      //to set
      NSValue *locationValue = [NSValue valueWithMKCoordinate:location.coordinate];
      [dictionary setObject:object forKey:locationValue];
      
      //to get
      NSValue *coordinateValue = dictionary[locationValue];
      CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];
      

      【讨论】:

        【解决方案3】:

        完全允许使用CLLocation 作为字典的键,这没有问题。 你得到nil的原因是因为没有值与键相关联,检查你填写字典的位置。

        关于您的多个CLLocation 键,每次您为字典中已存在的键设置对象时,都会向先前的值发送release 消息,而新的值将取代它。因此,如果您有多个要存储的位置并且有些位置相等,则应该找到另一种类型作为字典的键。

        【讨论】:

        • 我以其他方式做到了。 CLLocation 对我来说效果不佳的原因是它包含的信息不仅仅是纬度/经度,因此比较具有相同纬度/经度的 2 个 CLLocation 不会导致匹配。我最终将 CLLocationCoordinate2D 对象转换为 NSValue 并将其用作字典的键。
        猜你喜欢
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        相关资源
        最近更新 更多