Если-еще и сам вопрос - PullRequest
0 голосов
/ 30 июля 2011
int age == 3;

if (age == 2)
NSLog(@"2");

if (age == 4)
NSLog(@"4");

if (age == 3)
NSLog(@"3");

Мне было интересно, какой смысл ставить else if вместо трех операторов if.

for (GameObject *character in listOfGameObjects) {
if (character.myGameObjectType == kPowerUpTypeHealth) { 
                characterHealth = 100.0f;
        } 
     }

Это в файле Viking.m.character и self (викинг) оба имеют переменную экземпляра, метод установки и метод получения characterHealth.Если я хочу сделать здоровье Викинга равным сотне, нужно ли мне писать self.characterHealth = 100.0f;, чтобы убедиться, что здоровье не добавлено к character?Или это у меня уже хорошо?

Спасибо!

Ответы [ 5 ]

1 голос
/ 30 июля 2011

Это две разные вещи.Если у вас есть оператор if, за которым следует 4 еще if, тогда будет выполнено только одно из этих 4 условий.Например, если у вас есть

     int age = 2;

 if (age == 2){
     NSLog(@"2");
 }else if (age <=2 ){
    NSLog(@"<=2");
 }else if (age >=2 ){
        NSLog(@">=2");
 }

Результат кода выше будет 2.Это потому, что первое условие было верным, поэтому нам не нужно проверять других.Однако, если вы имеете дело с кучей if, скажем

    int age = 2;

if (age == 2){
    NSLog(@"2");
}
if (age <=2 ){
   NSLog(@"<=2");
}
if (age >=2 ){
       NSLog(@">=2");
}

Результат будет 2 <=2 >=2.По существу все заявления были выполнены.

1 голос
/ 30 июля 2011

Ваш первый фрагмент всегда будет записывать 2, 4 и 3, поэтому он сильно отличается от последовательности if / else if / else if (которая всегда будет записывать 2, и ничего больше).

Если вы написали это с if (a == 2), то разница с if / else состоит в том, что ваш код всегда будет запускать три теста, тогда как тот с else s мог бы пропустить некоторые. (Также рассмотрите утверждение switch.)

Для вашего второго вопроса, можно опустить self. Но если это выглядит неоднозначно / запутанно для вас, сделайте это. Это ничего не меняет.

1 голос
/ 30 июля 2011

Дело в том, что если у вас 3 оператора if, все эти условия будут проверены, так как age может иметь только 1 значение, вы должны использовать

if (age == 2)  //You need the double equals, to check for equality, if you use one equals it will assign the value and the if statement will always be true.

else if (age == 3)

else if (age == 4)

поэтому после выполнения одного из этих условий другие условия НЕ будут проверяться, что экономит время обработки.

Что касается self, то оно будет работать в обоих направлениях, однако, если characterHealth равно @property, использование self даст ему значение @synthetize setter, поэтому, если вы объявили его как retain, это увеличит retain считать на 1, если вы назначите его без себя, это не увеличит количество retain. Хотя, поскольку вы присваиваете ему primitive, в данном случае это не имеет значения, только objects имеет счет удержания.

0 голосов
/ 30 июля 2011

Стиль управления потоком - предмет многих горячих квази-религиозных споров;)

Обычно вы используете else if в ситуации, когда вам нужно отлавливать конечное число дел перед всеобъемлющим else делом. Скажите, хотите ли вы проверить, был ли возраст 3, 4 или что-то еще:

if (age == 3) {
} else if (age == 4) {
} else {
}
0 голосов
/ 30 июля 2011

В этом случае, если и иначе, если не имеют значения. Поскольку условия являются исключительными, рассмотрим этот пример:

if(age > 15)
{ 
    NSLog(@"over 15");
}

if (age < 17)
{
    NSLog(@"under 17");
}

Это напечатает более 15 до 17

Используйте иначе, если вы хотите распечатать только один из них.

При доступе к свойству предполагается самообладание. Это не изменит персонажа, потому что вы не указали character.characterHealth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...