Сравните два NSDates за ту же дату/время

Является ли date1 == date2 недействительным способом сравнения? Если нет, то какова правильная альтернатива?

Здесь мой код:

- (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

}

Ответ 1

Вы сравниваете два значения указателя. Вам нужно использовать метод сравнения NSDate, например:

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

Ответ 2

Как и в языке C (из которого Objective-C является надмножеством), оператор == (равенство) сравнивает два значения указателя, чтобы убедиться, что они эквивалентны (т.е. если две переменные содержат один и тот же объект). Хотя это работает при сравнении примитивных значений (int s, char s, bool s), он не работает с объектами Objective-C, которые могут быть равны по содержанию, но отличаются положением в памяти (что и есть оператор равенства сравнивает).

Чтобы проверить, равны ли два объекта, NSObject предлагает метод -isEqual:, который можно использовать как общий оператор (например, [date1 isEqual:date2]), а некоторые классы предпочитают предлагать более конкретный метод сравнения, например -isEqualToDate: используется для сравнения NSDate s или -isEqualToString:, используемого для сравнения NSString s. Эти методы не могут использоваться для сравнения примитивных типов (например, int s), поскольку они не являются объектами, но будут работать практически со всеми объектами.

Ответ 3

Вы не можете использовать == в Objective-C для сравнения равенства объектов (это займет значение C, сравнивая указатели). Как и другие языки, вы просто сравниваете указатели объектов.

Желаемое сообщение isEqualToDate:, aka [date1 isEqualToDate:date2]