2011-07-21 64 views
6

是否可以将CLLocation对象用作字典中的键?当我尝试这样做时,即使有已经插入完全相同经度和纬度的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中有多个相同纬度和经度的位置对象。

回答

6

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

您在评论中所描述的解决方案是很多情况下相当不错的解决方法:

我结束了CLLocationCoordinate2D对象转换为NSValue和使用 ,作为关键的字典。

2

它完全被允许使用CLLocation作为字典的关键字,没有问题。 你之所以得到nil是因为没有任何值与密钥关联,请检查你填入字典的位置。

关于您的倍数CLLocation键,每当您为字典中已存在的键设置对象时,以前的值将发送release消息,新的将取代它。所以如果你有多个位置来存储和一些是平等的,你应该找到另一种类型作为字典的关键字。

+0

你解决? – 2011-07-21 09:11:40

+1

我做了一些其他的方式。 CLLocation对我来说效果不好的原因是,它有更多的信息,而不仅仅是lat/long,所以比较2个CLLocations和相同的经纬度不会导致匹配。我最终将CLLocationCoordinate2D对象转换为NSValue,并将其用作字典的关键字。 –

5

有一个在MapKit框架NSValueMapKitGeometryExtensions类别上NSValue

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

//to get 
NSValue *coordinateValue = dictionary[locationValue]; 
CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];