Какао: пока (index> = 0) продолжается, хотя index == -1 - PullRequest
0 голосов
/ 15 июля 2010

У меня есть следующий код:

-(void)removeFilesWithPathIndices:(NSIndexSet*)indexSet {
    NSInteger index = [indexSet firstIndex];
    while(index >= 0) {
        [self removeFileWithPathIndex:index];
        index = [indexSet indexGreaterThanIndex:index];
    }
}

Который должен проходить через NSIndexSet. Однако цикл while не останавливается, даже если index = -1 согласно

 NSLog(@"%d", index);

Кто-нибудь может решить эту загадку для меня? :)

Ответы [ 2 ]

10 голосов
/ 15 июля 2010

Не принимайте NSInteger как int. На самом деле это не так. Итак, %d в

NSLog(@"%d", index);

обманывает вас, если вы компилируете в 64-битном режиме. См. NSInteger документацию.

Вы даже не предполагали, что indexGreaterThanIndex вернет -1. В документации явно сказано, что возвращается NSNotFound. Следуя документации, вы в конечном итоге обнаружите, что NSNotFound равно NSIntegerMax, максимально возможное значение в NSInteger. Когда NSInteger равен long и превращен в int, его становится -1. Но это деталь реализации, и вы не должны на это полагаться. Вот почему они определили символическую константу NSNotFound для начала.

Вы должны были следовать указаниям документации и написать код вроде

while(index != NSNotFound) {
    [self removeFileWithPathIndex:index];
    index = [indexSet indexGreaterThanIndex:index];
}

В некотором смысле, вы не должны были даже объявить

NSInteger index;

потому что все индексы в Foundation NS U Integer.

5 голосов
/ 15 июля 2010

indexGreatherThanIndex: возвращает NSNotFound, когда нет ничего больше указанного индекса. Документация Apple

NSNotFound определяется как NSIntegerMax, что составляет >= 0. Документация Apple

Ваше заявление NSLog просто дает вам обманчивый результат. Вместо:

while(index >= 0)

Использование:

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