将两个 NSArrays 与内部不可比较的对象相交
Intersecting two NSArrays with non-comparable objects inside
以下代码从 EventKit 接收所选日期的事件数组,然后 "pads" 现有日历事件和空事件以填充全天的每小时时段(例如 9-5)。
来自 iOS 日历的事件包含在我创建的自定义事件容器 class 中。事件 class 具有以下属性:
// HDEvent.h
@interface HDEvent : NSObject
@property(nonatomic, copy) NSDate *startDate;
@property(nonatomic, copy) NSDate *endDate;
@property(nonatomic, strong) EKEvent *event;
@property(nonatomic, copy) NSString *eventIdentifier;
@property(nonatomic, copy) NSString *tempTitle;
@end
我正在尝试根据 HDEvent
对象的 start/end 日期,用日历中的任何真实事件替换空事件。以下方法的传入数组包含设备日历中的事件(如果有)。
- (NSArray *)addEmptyEventsWithEvents:(NSMutableArray *)events
ForDate:(NSDate *)date {
NSMutableOrderedSet *finalEvents = [[NSMutableOrderedSet alloc] init];
// this returns an array filled with the empty HDEvents
// for the expected date range.
NSArray *emptyEvents = [self getEventsTimeRangeFromDate:date];
for (HDEvent *emptyEvent in emptyEvents) {
HDEvent *eventToAdd;
for (HDEvent *event in events) {
NSLog(@"Event: %@", event.event.title);
if ([event.startDate isEqualToDate:emptyEvent.startDate] ||
[event.endDate isEqualToDate:emptyEvent.endDate])
{
eventToAdd = event;
} else {
eventToAdd = emptyEvent;
}
}
[finalEvents addObject:eventToAdd];
}
return [finalEvents array];
}
我正在尝试用我的事件创建一个数组,如下面的伪代码所示:
// Calendar Events
[
10:00-11:00 MEETING,
11:00-12:00 LUNCH
]
// Empty Placeholders
[
09:00-10:00 EMPTY,
10:00-11:00 EMPTY,
11:00-12:00 EMPTY,
12:00-01:00 EMPTY,
01:00-02:00 EMPTY,
02:00-03:00 EMPTY,
03:00-04:00 EMPTY,
04:00-05:00 EMPTY,
]
// Final desired result:
[
09:00-10:00 EMPTY,
10:00-11:00 MEETING,
11:00-12:00 LUNCH,
12:00-01:00 EMPTY,
01:00-02:00 EMPTY,
02:00-03:00 EMPTY,
03:00-04:00 EMPTY,
04:00-05:00 EMPTY,
]
[问题]:
问题是返回的数组只包含日历中的一个事件(尽管我可以在 NSLog 响应中看到那天我有两个事件)
如果我交换 for 循环,那么我会得到 9 个事件(同样,只有一个来自日历,还有一个重复的空事件。)
谢谢@vikingosegundo。
我最终在我的 class 中实施了一个自定义比较方法,遵循此处答案中包含的建议:
我还通过使用 Matthew York 在 GitHub 上找到的优秀 DateTools 将其扩展为更加灵活:https://github.com/MatthewYork/DateTools
这是我的最终代码:
-(BOOL)isEqualToEvent:(HDEvent*)event {
if (self == event) {
return YES;
}
if ([event.startDate isEqualToDate:self.startDate] &&
[event.endDate isEqualToDate:self.endDate]) {
return YES;
} else {
return NO;
}
}
-(BOOL)doesEventIntersectEvent:(HDEvent*)event {
DTTimePeriod *eventTimePeriod = [DTTimePeriod timePeriodWithStartDate:event.startDate endDate:event.endDate];
DTTimePeriod *selfTimePeriod = [DTTimePeriod timePeriodWithStartDate:self.startDate endDate:self.endDate];
if ([eventTimePeriod intersects:selfTimePeriod]) {
return YES;
} else {
return NO;
}
}
-(BOOL)doesEventContainEvent:(HDEvent*)event {
DTTimePeriod *eventTimePeriod = [DTTimePeriod timePeriodWithStartDate:event.startDate endDate:event.endDate];
DTTimePeriod *selfTimePeriod = [DTTimePeriod timePeriodWithStartDate:self.startDate endDate:self.endDate];
if ([eventTimePeriod contains:selfTimePeriod]) {
return YES;
} else {
return NO;
}
}
以下代码从 EventKit 接收所选日期的事件数组,然后 "pads" 现有日历事件和空事件以填充全天的每小时时段(例如 9-5)。
来自 iOS 日历的事件包含在我创建的自定义事件容器 class 中。事件 class 具有以下属性:
// HDEvent.h
@interface HDEvent : NSObject
@property(nonatomic, copy) NSDate *startDate;
@property(nonatomic, copy) NSDate *endDate;
@property(nonatomic, strong) EKEvent *event;
@property(nonatomic, copy) NSString *eventIdentifier;
@property(nonatomic, copy) NSString *tempTitle;
@end
我正在尝试根据 HDEvent
对象的 start/end 日期,用日历中的任何真实事件替换空事件。以下方法的传入数组包含设备日历中的事件(如果有)。
- (NSArray *)addEmptyEventsWithEvents:(NSMutableArray *)events
ForDate:(NSDate *)date {
NSMutableOrderedSet *finalEvents = [[NSMutableOrderedSet alloc] init];
// this returns an array filled with the empty HDEvents
// for the expected date range.
NSArray *emptyEvents = [self getEventsTimeRangeFromDate:date];
for (HDEvent *emptyEvent in emptyEvents) {
HDEvent *eventToAdd;
for (HDEvent *event in events) {
NSLog(@"Event: %@", event.event.title);
if ([event.startDate isEqualToDate:emptyEvent.startDate] ||
[event.endDate isEqualToDate:emptyEvent.endDate])
{
eventToAdd = event;
} else {
eventToAdd = emptyEvent;
}
}
[finalEvents addObject:eventToAdd];
}
return [finalEvents array];
}
我正在尝试用我的事件创建一个数组,如下面的伪代码所示:
// Calendar Events
[
10:00-11:00 MEETING,
11:00-12:00 LUNCH
]
// Empty Placeholders
[
09:00-10:00 EMPTY,
10:00-11:00 EMPTY,
11:00-12:00 EMPTY,
12:00-01:00 EMPTY,
01:00-02:00 EMPTY,
02:00-03:00 EMPTY,
03:00-04:00 EMPTY,
04:00-05:00 EMPTY,
]
// Final desired result:
[
09:00-10:00 EMPTY,
10:00-11:00 MEETING,
11:00-12:00 LUNCH,
12:00-01:00 EMPTY,
01:00-02:00 EMPTY,
02:00-03:00 EMPTY,
03:00-04:00 EMPTY,
04:00-05:00 EMPTY,
]
[问题]:
问题是返回的数组只包含日历中的一个事件(尽管我可以在 NSLog 响应中看到那天我有两个事件)
如果我交换 for 循环,那么我会得到 9 个事件(同样,只有一个来自日历,还有一个重复的空事件。)
谢谢@vikingosegundo。
我最终在我的 class 中实施了一个自定义比较方法,遵循此处答案中包含的建议:
我还通过使用 Matthew York 在 GitHub 上找到的优秀 DateTools 将其扩展为更加灵活:https://github.com/MatthewYork/DateTools
这是我的最终代码:
-(BOOL)isEqualToEvent:(HDEvent*)event {
if (self == event) {
return YES;
}
if ([event.startDate isEqualToDate:self.startDate] &&
[event.endDate isEqualToDate:self.endDate]) {
return YES;
} else {
return NO;
}
}
-(BOOL)doesEventIntersectEvent:(HDEvent*)event {
DTTimePeriod *eventTimePeriod = [DTTimePeriod timePeriodWithStartDate:event.startDate endDate:event.endDate];
DTTimePeriod *selfTimePeriod = [DTTimePeriod timePeriodWithStartDate:self.startDate endDate:self.endDate];
if ([eventTimePeriod intersects:selfTimePeriod]) {
return YES;
} else {
return NO;
}
}
-(BOOL)doesEventContainEvent:(HDEvent*)event {
DTTimePeriod *eventTimePeriod = [DTTimePeriod timePeriodWithStartDate:event.startDate endDate:event.endDate];
DTTimePeriod *selfTimePeriod = [DTTimePeriod timePeriodWithStartDate:self.startDate endDate:self.endDate];
if ([eventTimePeriod contains:selfTimePeriod]) {
return YES;
} else {
return NO;
}
}