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.