2

NewsArticleオブジェクトのNSArrayがあります。

@interface NewsArticle : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSDate *dateTime;
@property (nonatomic, strong) NSString *content;

@end

NSArrayそして、それぞれに格納されている一意の日付(時間を無視)を作成したいと思いますarticle.dateTime-配列を列挙して自分でチェックすることで、これを長い道のりで行うことができることはわかっていますが、もっと簡単な解決策を望んでいます。

私はC#のバックグラウンドを持っており、C#では簡単なLINQステートメントでこれを実行できることを知っていNSPredicateます。この機能を提供しているように見えますが、その方法を理解したり、オンラインで適切な例を見つけたりすることはできません。

4

2 に答える 2

4

NSPredicateオブジェクトのコレクションをフィルタリングするように設計されていますが、コレクションの各メンバーからプロパティを抽出する必要があります。

(CAMOBAPがコメントで述べたように)Key-Valueコーディング(KVC)を使用して、すべてのdateTime値の配列を取得できます。次に、を使用しNSSetて重複を排除できます。

NSArray *allDateTimes = [articles valueForKey:@"dateTime"];
NSSet *uniqueDateTimes = [NSSet setWithArray:allDateTimes];

@distinctUnionOfObjectsやや難解なキーを使用して、1つのKVCメッセージですべてを実行することもできます。

NSArray *uniqueDateTimes = [articles valueForKeyPath:@"@distinctUnionOfObjects.dateTime"];

この2番目の例ではvalueForKeyPath:、を使用しているのではなく、を使用していることに注意してくださいvalueForKey:

Key-Valueコーディングプログラミングガイドを読むことで、より多くのことを学ぶことができます(もっとたくさん!)。

于 2012-11-13T09:17:39.063 に答える
0

NSPredicateすでに述べたように、でこれを行うことはできません。別の解決策は次のとおりです。


    NSMutableOrderedSet dailySet = [[NSMutableOrderedSet alloc] init]; //Or NSMutableSet if the order isn't important
    NSCalendar calendar = [NSCalendar currentCalendar];
    for (NSDate *date in [articles valueForKey:@"dateTime"]) {
if ([date isEqual:[NSNull null]]) { [dailySet addObject:date]; //or don't add it continue; }
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date]; [dailySet addObject:[calendar dateFromComponents:components]]; }

于 2015-09-10T11:10:10.163 に答える