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 在他的评论中所说)使用键值编码 (KVC) 来获取所有dateTime值的数组。然后您可以使用 anNSSet来消除重复项:

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

您甚至可以在一条 KVC 消息中完成所有操作,使用有点深奥的@distinctUnionOfObjects键:

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

请注意,第二个示例使用valueForKeyPath:,而不是valueForKey:

您可以通过阅读Key-Value Coding Programming Guide了解更多信息(哦,更多!)。

于 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 回答