2011-04-12 9 views
14

¿date1 == date2 no es una forma válida de comparar? Si no, ¿cuál es la alternativa correcta?Comparar dos NSDates para la misma fecha/hora

Aquí está mi código:

- (NSDate*) dateWithNoTime { 
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 
    NSDateComponents* components = [calendar components:flags fromDate:self]; 
    NSDate* dateOnly = [calendar dateFromComponents:components]; 
    return dateOnly; 
} 

- (BOOL) sameDayAsDate:(NSDate*)dateToCompare { 
    NSDate *date1 = [self dateWithNoTime]; 
    NSDate *date2 = [dateToCompare dateWithNoTime]; 
    return date1 == date2;  // HERE IS WHERE THINGS SEEM TO FAIL 

} 

Respuesta

42

Usted está comparando dos valores de puntero. Es necesario utilizar el método de comparación NSDate como:

return ([date1 compare:date2] == NSOrderedSame); 
+0

¿No es esto llamado por 'isEqual:'? –

4

No se puede utilizar == en Objective-C para comparar igualdad de objetos (que tomará el significado C, la comparación de punteros). Al igual que otros lenguajes, simplemente compara los punteros del objeto.

El mensaje que desea es isEqualToDate:, también conocido como [date1 isEqualToDate:date2]

+3

"Nunca se puede usar' == 'en Objective-C" es un poco duro. Por supuesto que puedes usarlo, pero no para el propósito que Greg está preguntando. Sí, lo que escribiste es correcto, pero la redacción es extraña. –

+0

isEqualToDate verifica la igualdad exacta, por lo que probablemente nunca sea verdadera. – jdog

8

Al igual que en el lenguaje C (de los cuales Objective-C es un superconjunto), el (la igualdad) operador == compara dos valores de puntero para ver si son equivalentes (es decir, si dos variables contienen el mismo objeto). Si bien esto funciona al comparar valores primitivos (int s, char s, bool s), no funciona en objetos Objective-C, que pueden ser iguales en contenido, pero difieren en la ubicación de memoria (que es lo que compara el operador de igualdad).

Para comprobar si dos objetos son iguales, NSObject ofrece un método -isEqual: que se puede utilizar como una declaración general (por ejemplo [date1 isEqual:date2]), y algunas clases de optar por ofrecer un método de comparación más específica, como -isEqualToDate: utiliza para comparar NSDate s o -isEqualToString: para comparar NSString s. Estos métodos no se pueden usar para comparar tipos primitivos (int s, por ejemplo) porque no son objetos, pero funcionarán en casi todos los objetos.