14

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

}
4

3 に答える 3

43

2 つのポインター値を比較しています。次のような NSDate 比較メソッドを使用する必要があります。

return ([date1 compare:date2] == NSOrderedSame);
于 2011-04-12T00:50:37.387 に答える
8

C 言語 (Objective-C はそのスーパーセットです) と同様に、==(等価) 演算子は 2 つのポインター値を比較して、それらが等しいかどうか (つまり、2 つの変数が同じオブジェクトを保持しているかどうか) を確認します。これはプリミティブ値 ( ints、chars、bools) の比較では機能しますが、Objective-C オブジェクトでは機能しません。内容が等しい可能性がありますが、メモリ位置が異なります (等値演算子が比較するもの)。

2 つのオブジェクトが等しいかどうかを確認するために、 は一般的なステートメントとして使用できるメソッドをNSObject提供します(例: )。一部のクラスは、s の比較に使用される、または s の比較に使用されるなど、より具体的な比較方法を提供することを選択します。これらのメソッドは、オブジェクトではないため、プリミティブ型 (たとえば ) の比較には使用できませんが、ほとんどすべてのオブジェクトで機能します。-isEqual:[date1 isEqual:date2]-isEqualToDate:NSDate-isEqualToString:NSStringint

于 2011-04-12T01:07:18.047 に答える
4

==オブジェクトの等価性を比較するために Objective-C で使用することはできません(ポインターを比較するという C の意味を持ちます)。他の言語と同様に、オブジェクト ポインターを比較しているだけです。

あなたが望むメッセージはisEqualToDate:、別名[date1 isEqualToDate:date2]

于 2011-04-12T00:51:50.037 に答える