2016-06-07 23 views
0

我希望能够重用此方法,以便它不受在for循环声明中调用的类的限制。将for循环转换为接受ID类型

问题是编译器不知道id实际是什么,所以我不能使用。它的符号。我需要将其转换为任何类型的事件类的,我会通过它,而不必重复方法SpecialEvent1SpecialEvent2SpecialEvent3

所以不是for (SpecialEvent1 *event in day)我希望能够像做for (id event in day)但问题发生时,我尝试访问时间或持续时间属性

- (NSArray *)sumDay:(NSArray *)day { 
    NSInteger morning = 0, afternoon = 0, evening = 0, night = 0; 

    for (SpecialEvent1 *event in day) { 
     NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:event.time]; 
     NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour fromDate:date]; 
     NSInteger hour = [components hour]; 

     if (hour < 12) { 
      morning += event.duration; 
     } 
     else if (hour < 18) { 
      afternoon += event.duration; 
     } 
     else if (hour < 20) { 
      evening += event.duration; 
     } 
     else { 
      night += event.duration; 
     } 
    } 

    NSArray *sums = @[@(morning), @(afternoon), @(evening), @(night)]; 
    return sums; 
} 
+0

你有没有问了一个问题或真正解释一个问题。你的意思是你想要使用具有'time'变量的任何对象的循环吗? – Wain

+0

你可能想要使用一个协议(它会响应“时间”),或者使用一个类Event,以及SpecialEvent1,SpecialEvent2,SpecialEvent3类继承。 – Larme

+0

@是的,我会通过的任何对象将具有它的时间和持续时间属性 –

回答

0

假设你不感兴趣的对象不具有timeduration属性,你可以定义一个协议,这样说:

@protocol TimedEvent <NSObject> 
-(NSTimeInterval)time; 
-(NSTimeInterval)duration; 
@end 

然后通过这样的数组:

- (NSArray *)sumDay:(NSArray *)day { 
    NSInteger morning = 0, afternoon = 0, evening = 0, night = 0; 

    for (id<TimedEvent> event in day) { 
     if (![event conformsToProtocol:@protocol(TimedEvent)]) { 
      continue; 
     } 
     NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:event.time]; 
     NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour fromDate:date]; 
     NSInteger hour = [components hour]; 

     if (hour < 12) { 
      morning += event.duration; 
     } 
     else if (hour < 18) { 
      afternoon += event.duration; 
     } 
     else if (hour < 20) { 
      evening += event.duration; 
     } 
     else { 
      night += event.duration; 
     } 
    } 

    NSArray *sums = @[@(morning), @(afternoon), @(evening), @(night)]; 
    return sums; 
}