2011-06-30 11 views
10

Mam problem z IsEqual:Jak przetestować równość dwóch CLLocations

kodu:

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

currentanchor i currentbusiness.getCllocation to lokalizacje

ale jeśli są one to samo, dlaczego funkcja b nazywa się? Czy coś jest nie tak z moim kodem?

Odpowiedz

23

Zakładam, że oba te obiekty są typu CLLocation, na podstawie nazwy getClLocation.

CLLocation nie ma żadnej specyfikacji na to, co robi jego metoda isEqual:, więc jest to prawdopodobnie tylko dziedziczenie realizację NSObject, który po prostu porównuje wskaźniki obiektów. Jeśli masz dwa różne obiekty z identycznymi danymi, implementacja ta powróci NO. A jeśli masz dwa różne obiekty z niewielką zmiennością lokalizacji, zdecydowanie nie będą one równe.

Prawdopodobnie nie chcesz isEqual: podczas porównywania obiektów lokalizacji. Zamiast tego prawdopodobnie będziesz chciał użyć metody distanceFromLocation: na CLLocation. Coś takiego byłoby lepsze:

CLLocationDistance distanceThreshold = 2.0; // in meters 
if ([currentAnchor distanceFromLocation:currentBusiness.getCllLocation] < distanceThreshold) 
{ 
    do a; 
} 
else 
{ 
    do b; 
} 
0

isEqual wystarczy sprawdzić tylko obiekty, a nie ich zawartość. musisz stworzyć własną metodę, w której uzyskasz dostęp do zmiennych obiektu i sprawdzisz je pod kątem równości przy użyciu operatora ==.

+0

To nie jest prawda, IsEqual ma robić tylko to, sprawdzić zawartość do określić, czy dwa obiekty są równe. Dwa obiekty nie są równe, jeśli ich właściwości nie są takie same. –

2

Minęło trochę czasu.

To, co zrobiłem, jest podobne do BJ Homera. Po prostu to dodaję.

@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 

Byłem zaskoczony, że były jednym z tym pytaniem :)

+0

Proponuję zadeklarować 'inny' jako' id' do bezpiecznego wdrożenia – Zerho

+2

Najprawdopodobniej taniej jest po prostu przetestować równość na współrzędnych iw przeciwnym razie zwrócić super. 'self.coordinate.latitude == other.coordinate.latitude && self.coordinate.longitude == other.coordinate.longitude' – FelixLam

+0

Nadpisujesz metodę w kategorii. To jest zła praktyka. Możesz uzyskać nieokreślone zachowanie tej metody. Zgodnie z dokumentacją Apple "Jeśli nazwa metody zadeklarowanej w kategorii jest taka sama jak metoda w oryginalnej klasie, lub metoda w innej kategorii na tej samej klasie (lub nawet nadklasy), zachowanie jest niezdefiniowane, aby która implementacja metody jest używana w środowisku wykonawczym. Jest to mniej prawdopodobne, jeśli chodzi o używanie kategorii z własnymi klasami, ale może powodować problemy podczas używania kategorii do dodawania metod do standardowych klas Cocoa lub Cocoa Touch. " –

0

Swift 4.0 wersja:

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 
} 
Powiązane problemy