2016-06-07 3 views
0

Я хочу, чтобы иметь возможность повторно использовать этот метод, чтобы он не ограничивался классом, вызываемым в объявлении цикла цикла.Преобразование цикла for для приема 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

@Wain yes, любой объект, который я пройду, будет иметь свойство времени и продолжительности на нем –

ответ

0

Предполагая, что вы не заинтересованы в объектах, которые не имеют time или duration свойство, можно определить протокол, который говорит, что это:

@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; 
} 
Смежные вопросы