2011-04-12 19 views
14

date1 == date2 Geçerli bir yöntem olarak değil mi? Değilse, doğru alternatif nedir? İki işaretçi değerlerini karşılaştırarak konumAynı tarihte/saat için iki NSDates karşılaştır

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

} 

cevap

42

:

İşte benim kod. (Bu işaretçiler karşılaştıran, C anlamını sürecektir) Sen nesne eşitliği karşılaştırmak için Objective-C == kullanamaz

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

Bu isEqual: 'ile değil mi? –

4

: Sen gibi NSDate karşılaştırma yöntemi kullanmak gerekir. Diğer diller gibi, sadece nesne işaretçilerini karşılaştırıyorsunuz.

istediğiniz mesajı == (eşitlik) operatörü onlar eşdeğerdir if (görmek için iki işaretçi değerlerini karşılaştırır (Objective-C olduğu bir set) C dilinde olduğu gibi aka [date1 isEqualToDate:date2]

+3

"Asla ==' Objective-C'de kullanamazsınız "biraz sert. Tabi ki bunu kullanabilirsin, sadece Greg'in sorduğu amaç için değil. Evet, yazdıkların doğru, ama sözler tuhaf. –

+0

isEqualToDate tam eşitliği denetler, bu nedenle muhtemelen hiçbir zaman doğru olmayacaktır. – jdog

8

, isEqualToDate: olduğunu yani iki değişken aynı nesneyi tutuyorsa). Bu, ilkel değerleri karşılaştırırken çalışırken (int s, char s, bool s), Objective-C nesnelerinde, içerikte eşit olabilecek, ancak bellek konumuna göre farklılık göstermez (eşitlik operatörünün karşılaştırması budur).

iki nesne eşit olup olmadığını

kontrol etmek NSObject genel bir açıklamada (örneğin [date1 isEqual:date2]) olarak kullanabileceğiniz bir -isEqual: yöntem sunmaktadır ve bazı sınıfları böyle NSDate s karşılaştırmak için kullanılır -isEqualToDate: gibi daha spesifik karşılaştırma yöntemi sunmayı tercih veya -isEqualToString:, NSString s numaralarını karşılaştırmak için kullanılır. Bu yöntemler ilkel türleri (örneğin, int s) karşılaştırmak için kullanılamaz çünkü bunlar nesne değildir, ancak hemen hemen tüm nesnelerde çalışır.