NSIntegerMax против NSUIntegerMax

NSUInteger index = [self.objects indexOfObject:obj];

if (index == NSNotFound) {
    // Success! Note: NSNotFound internally uses NSIntegerMax
}

if (index == NSUIntegerMax) {
    // Fails!
}

Зачем? Я полагаю, чтобы получить значение без знака в результате indexOfObject. Поэтому, естественно, я предполагал, что если объект не найден, он вернет NSUIntegerMax вместо NSIntegerMax. Это ошибка, или есть логическое объяснение такого поведения.

3 ответа

Решение

Возможно NSNotFound может быть использован в контекстах, которые используют NSInteger, Это также безопаснее, если кто-то объявит индекс как NSInteger вместо NSUInteger,

Самое большее, можно сказать, что странно, что NSNotFound определяется как NSIntegerMax, но это, конечно, не ошибка.

Ваше предположение просто неверно. Возвращает NSNotFound Что бы это ни было сейчас или будет в будущем. И это может легко отличаться на разных платформах (то есть 32 против 64 бит).

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

NSUInteger без знака ("U") в то время как NSInteger подписан

Вы все еще можете сравнить значения без знака и целого числа со знаком. Предполагать, что NSNotFound фактически равен NSUIntegerMax, вероятно, является ошибкой. Фактически он определяется как равный NSIntegerMax в NSObjCRuntime.h.

Другие вопросы по тегам