0

私は最初の立ち上げ日からの時差をチェックする必要があるプロジェクトに取り組んでいます。NSDayCalendarUnitとNSWeekCalendarUnitを使用しています。基本的に2日おきの最初の2週間は何かをしたいです。私が使用しているオブジェクトは、一度に2日ごとに特定の状態である必要があります。

だから例えば

Day 1 & 2, Week 0 - State 1
Day 3 & 4, Week 0 - State 2
...
Day 1 & 2, Week 1 - State 8
Day 3 & 4, Week 1 - State 9

これが私のコードです:

    // get the data/time difference from the first launch
    int daysDifferent = [[dateDifferenceInfo objectForKey:@"days"] intValue];
    int weeksDifferent = [[dateDifferenceInfo objectForKey:@"weeks"] intValue];

    if(daysDifferent == 2 | daysDifferent == 3 && !weeksDifferent && _dot.age != 2){
        // set state
    }

    if(daysDifferent == 4 | daysDifferent == 5 && !weeksDifferent && _dot.age != 3){
        // set state
    }
    if((daysDifferent == 6 && weeksDifferent == 0 | daysDifferent == 0 && weeksDifferent == 1) && _dot.age != 4){
       // set state
    }

    if(daysDifferent == 0 | daysDifferent == 1 && weeksDifferent == 1 && _dot.age != 5){
       // set state
    }

    if(daysDifferent == 2 | daysDifferent == 3 && weeksDifferent == 1  && _dot.age != 6){
      // set state   
    }

    if(daysDifferent == 4| daysDifferent == 5 && weeksDifferent == 1  && _dot.age != 7){
      // set state   
    }

    if((daysDifferent == 6 && weeksDifferent == 1 | daysDifferent == 0 && weeksDifferent == 2)  && _dot.age != 8){
      // set state
    }

    if(weeksDifferent >= 2 && !(daysDifferent % 2)){
      // set state
    }

補足:私はそれが悪いコードであることを知っています、私はこれをスイッチケースに置き換えることを計画しています、私は最初にロジックソートする必要があります。

私の質問は、この種のパターンを計算するより良い方法はありますか?

4

1 に答える 1

0

あなたが言うように、私はあなたの目標について完全に明確ではありません:

2日おきの最初の2週間は何かをしたいです。

だから例えば

Day 1 & 2, Week 0 - State 1
Day 3 & 4, Week 0 - State 2
...
Day 1 & 2, Week 1 - State 8
Day 3 & 4, Week 1 - State 9

私が思っていたところ

Day 1 & 2, Week 0 - State 1
Day 3 & 4, Week 0 - State 2
Day 5 & 6, Week 0 - State 3
Day 7 Week 0 & Day 1 Week 1 - State 4.
...

したがって、例が正しければ、計算は異なります。

より簡単な例に基づいて、最初のデートからの時間間隔を計算し、1日の長さの2倍で割って、フロアを取得します。それが状態です:

NSDate *firstDate = ...
NSDate *secondDate = ...
NSTimeInterval interval = [ secondDate timeIntervalSinceDate: firstDate ];
double secondsPerDay = 60 * 60 * 24.0; // s per min times min per hr times hrs per dy. 
int state = (int) (interval / secondsPerDay * 0.5 ) + 1; 

一方、実際にあなたが説明したとおりである場合、私が使用するアプローチは、同様の計算を実行することです-最後の行の0.5係数を省略してから、単純なテーブルルックアップを使用してその日から状態を取得します。

int table[ 14 ] = { 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8 };
int state = table[ (int) (interval / secondsPerDay ) ]; 
于 2012-04-11T12:15:02.643 に答える