Ответ 1
Вы сравниваете два значения указателя. Вам нужно использовать метод сравнения NSDate, например:
return ([date1 compare:date2] == NSOrderedSame);
Является ли 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
}
Вы сравниваете два значения указателя. Вам нужно использовать метод сравнения NSDate, например:
return ([date1 compare:date2] == NSOrderedSame);
Как и в языке C (из которого Objective-C является надмножеством), оператор ==
(равенство) сравнивает два значения указателя, чтобы убедиться, что они эквивалентны (т.е. если две переменные содержат один и тот же объект). Хотя это работает при сравнении примитивных значений (int
s, char
s, bool
s), он не работает с объектами Objective-C, которые могут быть равны по содержанию, но отличаются положением в памяти (что и есть оператор равенства сравнивает).
Чтобы проверить, равны ли два объекта, NSObject
предлагает метод -isEqual:
, который можно использовать как общий оператор (например, [date1 isEqual:date2]
), а некоторые классы предпочитают предлагать более конкретный метод сравнения, например -isEqualToDate:
используется для сравнения NSDate
s или -isEqualToString:
, используемого для сравнения NSString
s. Эти методы не могут использоваться для сравнения примитивных типов (например, int
s), поскольку они не являются объектами, но будут работать практически со всеми объектами.
Вы не можете использовать ==
в Objective-C для сравнения равенства объектов (это займет значение C, сравнивая указатели). Как и другие языки, вы просто сравниваете указатели объектов.
Желаемое сообщение isEqualToDate:
, aka [date1 isEqualToDate:date2]