использование объектов CLLocation в качестве ключей в словаре - PullRequest
6 голосов
/ 21 июля 2011

Можно ли использовать объекты 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 с одинаковой широтой и долготой.

Ответы [ 3 ]

6 голосов
/ 03 ноября 2011

CLLocation, похоже, не переопределяет isEqual для выполнения фактического сравнения содержимого, вместо этого он сравнивает равенство на основе идентичности объекта. Следовательно, неразумно использовать его в качестве ключа в словаре, если только вы не всегда обращаетесь к нему с использованием одного и того же объекта.

Решение, которое вы описали в комментарии, является хорошим решением для многих ситуаций:

В итоге я преобразовал CLLocationCoordinate2D объект в NSValue и использовал это как ключ к словарю.

5 голосов
/ 30 января 2014

Существует категория NSValueMapKitGeometryExtensions на NSValue в структуре MapKit

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

//to get
NSValue *coordinateValue = dictionary[locationValue];
CLLocationCoordinate2D coordinate = [coordinateValue MKCoordinateValue];
2 голосов
/ 21 июля 2011

Полностью разрешено использовать CLLocation в качестве ключей для словаря, с этим проблем нет.Причина, по которой вы получаете nil, заключается в том, что никакое значение не связано с ключом, проверьте, где вы заполняете словарь.

О ваших кратных CLLocation ключах, каждый раз, когда вы устанавливаете объект для ключа, который уже существует в словаре, предыдущему значению будет отправлено сообщение release, и новое займет его место.Поэтому, если у вас есть несколько мест для хранения, и некоторые из них равны, вы должны найти другой тип в качестве ключа для словаря.

...