1

У меня есть приложение iOS с несколькими простыми и логичными if-statements. Однако они не побегут, и я не могу понять, почему. Вот мой простой код:Если оператор не работает - iOS

-(void)viewDidLoad { 

    [super viewDidLoad]; 

    // Run setup code. 

    int day = [self currentDay]; 

    if ((day == (1 || 3 || 7) && (day != (2 || 4 || 5 || 6))) { 

     // Run the calendar setup code for 
     // Sunday/Tuesday OR saturday. 
     [self runSetupVX_4]; 
    } 

    else if ((day == (2 || 4 || 5 || 6)) && (day != (1 || 3 || 7))) { 

     // Run setup code for Monday 
     // wednesday, thursday and friday. 
     [self runSetupVX_2]; 
    } 
} 

-(int)currentDay { 

    NSDateComponents *component = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]]; 
    return [component weekday]; 
} 

Что я здесь делаю неправильно?

+0

'если (день == 1 || день == 2 || день == 3 ....) ' – Desdenova

+0

что вы имеете в виду, что я не буду запускать? У вашего кода есть ошибки? Или вы имеете в виду, что это не входит ни в одно из утверждений? – hoya21

+2

Я никогда не видел этот синтаксис 'day == (1 || 3 || 7)' раньше в 'if statement'. Откуда вы это взяли? – Popeye

ответ

6

компилируется, но он делает что-то совершенно отличное от того, что вы пытаетесь достичь:

day == (1 || 3 || 7) && (day != (2 || 4 || 5 || 6) 

В заявлении ОШ 1, 3 и 7, и затем ORs 2, 4, 5 и 6, перед выполнением сравнений.

Правильный способ сделать это - сравнить day с 1, 3 и 7 отдельно. Если какой-либо из сравнений успешна, это также гарантирует, что день не 2, 4, 5 или 6:

if (day == 1 || day == 3 || day == 7) 
    ... 
if (day == 2 || day == 4 || day == 5 || day == 6) 
    ... 

Вы также можете переписать с switch:

switch(day) { 
    case 1: 
    case 3: 
    case 7: 
     // Run the calendar setup code for 
     // Sunday/Tuesday OR saturday. 
     [self runSetupVX_4]; 
     break; 
    case 2: 
    case 4: 
    case 5: 
    case 6: 
     // Run setup code for Monday 
     // wednesday, thursday and friday. 
     [self runSetupVX_2]; 
     break; 
} 
+0

Но с вашей функцией if у вас много копий '' 'day ==' '', вот почему я пытался в этом вопросе. В любом случае мне нравится метод '' 'switch''', который вы написали. Я буду использовать это, поскольку у него нет кодовых копий. Благодарю. – Johnysmith

+0

@Johnysmith Objective-C не предлагает встроенный синтаксис для операции «x является членом коллекции», поэтому вам нужно повторить часть «day == ...» по сравнению с несколькими константами. Когда список короткий, это не имеет значения, потому что код остается ясным для читателя. Когда список становится длиннее, 'switch' предлагает хорошо читаемую альтернативу. – dasblinkenlight

+0

Хотя я не собираюсь голосовать за этот ответ, я должен не согласиться с этим. Посмотрите на ответ @Skrew. Он делает то, что должен делать любой программист: он сохраняет код простым и чистым. Я думаю, что ваш ответ слишком застенчив ..... –

-3

Вы можете поместить точку останова в оператор if, а затем проверить, вызывается ли оператор, вызываемый или нет.

+0

Я думаю, что использование '' 'breakpoints''' было бы намного лучшим способом отладки независимо от того, выполняются ли инструкции if. –

+0

Это комментарий не ответ – Popeye

4

Вы немного смущаете его.

if(day==1 || day==2 || day==3){ 
    [self runSetupVX_4]; 
}else{ 
    [self runSetupVX_2]; 
} 

Если сделать трюк

+3

Это должен быть принятый ответ. Это самое простое и практичное решение из всех ответов. –

+0

@ Dan Я согласен. Мне нравится простота этого ответа. Другие ответы очень похожи на код OPs. – Supertecnoboff

+0

@ Dan Я бы не согласился с вами, это не должно быть принятым ответом, поскольку принятый ответ от 'dasblinkenlight' фактически отвечает на вопрос и дает очень хороший подробный ответ, а также предоставляет альтернативы. Просто потому, что ответ прост, это не значит, что он обязательно правильный. – Popeye

0

, если первая часть каждого оператора if истинна, тогда вторая часть будет ложной каждый раз. Поэтому вам не нужно проверять вторую часть.

Вы можете изменить свой код так:

-(void)viewDidLoad { 

[super viewDidLoad]; 

// Run setup code. 

int day = [self currentDay]; 

if (day ==1 || day==3 || day==7) { 

    // Run the calendar setup code for 
    // Sunday/Tuesday OR saturday. 
    [self runSetupVX_4]; 

} 
else{ 

     // Run setup code for Monday 
     // wednesday, thursday and friday. 
     [self runSetupVX_2]; 


}} 

-(int)currentDay { 

    NSDateComponents *component = [[NSCalendar currentCalendar]   components:NSCalendarUnitWeekday fromDate:[NSDate date]]; 
    return [component weekday]; 
} 
0

Надеется, что это работает для вас:

if (day == 1 || day == 2 || day == 3) { 

    // Run the calendar setup code for 
    // Sunday/Tuesday OR Saturday. 
    [self runSetupVX_4]; 
} 

else if (day == 2 || day == 4 || day == 5 || day == 6) { 

    // Run setup code for Monday 
    // Wednesday, Thursday and Friday. 
    [self runSetupVX_2]; 
} 
-3
-(void)viewDidLoad { 

    [super viewDidLoad]; 

    // Run setup code. 

    int day = [self currentDay]; 
    //if ((day == (1 || 3 || 7) && (day != (2 || 4 || 5 || 6))) { 
    //here u will get 0 or 1 from this (1 || 3 || 7) && (day != (2 || 4 || 5 || 6))) 
    //And u r comparing with 0 or 1 with day so please check below code how to compare 

    if (((day == 1 || 3 || 7) && (day != 2 || 4 || 5 || 6)) { 

    // Run the calendar setup code for 
    // Sunday/Tuesday OR saturday. 
    [self runSetupVX_4]; 
    } 

    else if ((day == 2 || 4 || 5 || 6)&& (day != 1 || 3 || 7)) { 

    // Run setup code for Monday 
    // wednesday, thursday and friday. 
    [self runSetupVX_2]; 
    } 
} 

-(int)currentDay { 

    NSDateComponents *component = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]]; 
    return [component weekday]; 
} //you have problems with comparing variable please check it 
+2

Этот ответ не лучше кода вопроса.Пожалуйста, прочитайте комментарии к другим ответам. Этот 'день == 1 || 3 || Неверный синтаксис для объектива-c для выполнения того, что они хотят. – Popeye