2016-06-07 27 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; 
}