2011-07-21 95 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];