2009-11-02 4 views
9

ho una classe personalizzata che ha come variabile di istanza una coordinata:Maneggiare le strutture vuote in Objective-C (coordinate in classe personalizzata)

CLLocationCoordinate2D eventLocation; 
@property(nonatomic) CLLocationCoordinate2D eventLocation; 

Sto parsing di un file XML che ha un campo facoltativo quello può o non può essere là. Se è ho impostato in questo modo:

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; 

Quello che faccio questo è fondamentalmente aggiungere un'annotazione su una mappa

annotation.coordinate = alert.info.eventLocation; 

so che ho bisogno di fare qualche controllo qui per fare in modo che che esiste ma non mi è permesso fare un if (info.eventLocation == nil) o anche if (info.eventLocation.latitude == nil)

Questa sembra una domanda molto semplice ma ho fatto qualche ricerca e nessuno è stato in grado di fornire veramente una buona risposta/idea. La mia architettura è completamente fuori?

risposta

24

Poiché CLLocationCoordinate2D è una struttura, non esiste un valore nil. Objective-C inizializza le strutture su 0 se sono variabili di istanza di oggetto, quindi se non si imposta un valore per eventLocation, annotation.coordinate.longitude e eventLocation.lattitude saranno entrambi 0. Poiché si tratta di una posizione valida, non è un indicatore utile.

avrei definire un valore non phyical:

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

e quindi assegnare questo valore al alert.info.eventLocation = EmptyLocationCoordinate per rappresentare un valore vuoto. È quindi possibile verificare se (alert.info.eventLocation == emptyLocationCoordinate).

+0

Quando aggiungo questo al mio file h del mio oggetto personalizzato Ricevo errori: elemento Initializer non è costante (nei pressi di inizializzazione per 'EmptyLocationCoordinate.latitude') elemento Initializer non è costante (nei pressi di inizializzazione per 'EmptyLocationCoordinate.longitude') – aleclerc

+0

in realtà, il alert.info.eventLocation = EmptyLocationCoordinate dà ancora un "operandi non validi ai binari! =" Errore – aleclerc

+0

Ah, forse avete bisogno di #define EmptyLocation. –

4

ho usato il codice di cui sopra tranne che non mi permetteva di dichiarare un const con un altro const, così ho semplicemente cambiato in:

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

Ho anche aggiunto nel mio init per la classe:

eventLocation = EmptyLocationCoordinate; 

Grazie per l'aiuto Barry.

3

Solo per completezza, è possibile utilizzare la costante kCLLocationCoordinate2DInvalid per conservare un riferimento a un valore non valido CLLocationCoordinate2D. (Vedi: @Klaas's answer)