2011-06-30 7 views
10

que estoy teniendo un problema con IsEqual:¿Cómo se prueba la igualdad de dos CLLocations

el código:

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

currentanchor y currentbusiness.getCllocation son lugares

pero si son lo mismo, ¿por qué se llama a la función b? ¿Hay algún problema con mi código?

Respuesta

23

Supongo que ambos objetos son del tipo CLLocation, según el nombre getClLocation.

CLLocation no tiene ninguna especificación de lo que haga su método isEqual:, por lo que es probable que sólo heredar la implementación de NSObject, que simplemente compara los punteros de los objetos. Si tiene dos objetos distintos con datos idénticos, esa implementación isEqual: devolverá NO. Y si tienes dos objetos distintos con solo una ligera variación en la ubicación, definitivamente no serían iguales.

Probablemente no desee isEqual: al comparar objetos de ubicación. Por el contrario, es probable que desee utilizar el método distanceFromLocation: en CLLocation. Algo como esto sería mejor:

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

isEqual solo revisa solo los objetos, no su contenido. necesita crear su propio método donde accede a las variables de objeto y verificar su igualdad usando el operador ==.

+0

no es cierto, se supone Este IsEqual para hacer precisamente eso, el registro de que el contenido determinar si dos objetos son iguales. Dos objetos no son iguales si sus propiedades no son las mismas. –

2

Ha pasado tiempo.

Lo que hice es similar con BJ Homer. Solo agrego esto.

@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 

Me sorprendió yo fuera el que hace esta pregunta :)

+0

sugiero que se declare 'other' como' id' para implementarlo de manera segura – Zerho

+2

Lo más probable es que sea más barato simplemente probar la igualdad en la coordenada y, de lo contrario, volver súper. 'self.coordinate.latitude == other.coordinate.latitude && auto.coordinate.longitude == other.coordinate.longitude' – FelixLam

+0

Está anulando un método en una categoría. Lo cual es una mala práctica. Es posible que obtenga un comportamiento no especificado de este método. Según la documentación de apple "Si el nombre de un método declarado en una categoría es el mismo que el de la clase original o el de otra categoría en la misma clase (o incluso una superclase), el comportamiento no está definido en cuanto a qué implementación del método se usa en tiempo de ejecución. Es menos probable que sea un problema si está usando categorías con sus propias clases, pero puede causar problemas al usar categorías para agregar métodos a las clases estándar Cocoa o Cocoa Touch ". –

0

Swift 4.0 Versión:

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 
} 
Cuestiones relacionadas