2009-11-02 14 views
9

que tienen una clase personalizada que tiene como una variable de instancia de una coordenada:Manejar estructuras vacías en Objective-C (Coordinate en clase personalizada)

CLLocationCoordinate2D eventLocation; 
@property(nonatomic) CLLocationCoordinate2D eventLocation; 

estoy analizar un archivo XML que tiene un campo opcional que puede o no estar allí. Si se trata de lo fijo, así:

CLLocationCoordinate2D location; 
NSArray *coordinateArray = [paramValue componentsSeparatedByString:@","]; 
if ([coordinateArray count] >= 2) { 
    location.latitude = [[coordinateArray objectAtIndex:0] doubleValue]; 
    location.longitude = [[coordinateArray objectAtIndex:1] doubleValue]; 
} else { 
    NSLog(@"Coordinate problem"); 
} 
info.eventLocation = location; 

Lo que hago esto es básicamente añadir una anotación en un mapa

annotation.coordinate = alert.info.eventLocation; 

sé que tengo que hacer algunas comprobaciones para asegurarse de que ese existe pero no puedo hacer un if (info.eventLocation == nil) o incluso if (info.eventLocation.latitude == nil)

Esto parece una pregunta muy básica pero he hecho algunas búsquedas y nadie ha sido capaz de realmente dar una buena respuesta/idea. ¿Mi arquitectura está completamente desactivada?

Respuesta

24

Porque CLLocationCoordinate2D es una estructura, no existe el valor nil. Objective-C inicializará las estructuras a 0 si son variables de instancia de objeto, por lo que si no establece un valor para eventLocation, annotation.coordinate.longitude y eventLocation.lattitude ambos serán 0. Como esta es una ubicación válida, no es un marcador útil.

Yo definiría un valor no phyical:

static const CLLocationDegrees emptyLocation = -1000.0; 
static const CLLocationCoordinate2D emptyLocationCoordinate = {emptyLocation, emptyLocation} 

y luego asignar este valor a su alert.info.eventLocation = EmptyLocationCoordinate para representar un valor vacío. A continuación, puede verificar si (alert.info.eventLocation == emptyLocationCoordinate).

+0

cuando agrego esto a mi archivo .h de mi objeto personalizado que estoy recibiendo errores: elemento inicializador no es constante (cerca de inicialización para 'EmptyLocationCoordinate.latitude') elemento inicializador no es constante (cerca de inicialización para 'EmptyLocationCoordinate.longitude') – aleclerc

+0

en realidad, el alert.info.eventLocation = EmptyLocationCoordinate todavía da un "operandos inválidos a binario! =" Error – aleclerc

+0

Ah, tal vez lo que necesita para #define EmptyLocation. –

4

he utilizado el código anterior excepto que no me dejaría declarar una constante con otro const, por lo que simplemente cambié a:

static const CLLocationDegrees EmptyLocation = -1000.0; 
static const CLLocationCoordinate2D EmptyLocationCoordinate = {-1000.0, -1000.0}; 

También he añadido en mi init de la clase:

eventLocation = EmptyLocationCoordinate; 

Gracias por la ayuda de Barry.

3

Para completar, puede usar la constante kCLLocationCoordinate2DInvalid para guardar una referencia a un CLLocationCoordinate2D no válido. (Ver: @Klaas's answer)

Cuestiones relacionadas