Почему этот простой оператор if> не работает правильно? - PullRequest
0 голосов
/ 04 февраля 2012

Это код:

int index = (gridPoint.y * self.iconsPerRow) + gridPoint.x;
    NSLog(@"index 1: %i", index);
    NSLog(@"count: %i", [self.icons count] - 1);
    if (index > [self.icons count] - 1) {
        index = [self.icons count] - 1;
    }
    if (index < 0) {
        index = 0;
    }
    NSLog(@"index 2: %i", index);

Выход:

NSLog index 1: -4
NSLog count: 3
NSLog index 2: 3

Есть идеи, почему это происходит? Это должно приводить к 0, если это число минус.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Это потому, что [self.icons count]; возвращает NSUInteger (индекс преобразуется в беззнаковое целое, которое будет преобразовано в UINT_MAX-3) Измените его на следующее:

int index = (gridPoint.y * self.iconsPerRow) + gridPoint.x;
NSLog(@"index 1: %i", index);
NSLog(@"count: %i", [self.icons count] - 1);
if (index < 0) {
    index = 0;
} else if (index + 1 > [self.icons count]) { // In case count is 0, we add to index rather than subtract from count
    index = [self.icons count] - 1;
}
NSLog(@"index 2: %i", index);
1 голос
/ 04 февраля 2012

-[NSArray count] возвращает целое число без знака.Вероятно, он конвертирует ваш -4 в целое число без знака, что ОЧЕНЬ большое число.Это больше, чем три, так что это утверждение срабатывает и устанавливает его на 3. Попробуйте это:

if (index >= self.icons.count) {
    ...
} 

Это позволяет избежать приведения и немного чище.

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