Возвращение nil
является ошибкой, поскольку вы возвращаете целочисленный примитив, а не объект. (Вы получаете предупреждение о приведении, потому что nil
на самом деле #define
, который оценивается в ((void *)0)
, который является нулевым указателем, а не целым нулем.) Лучший вариант для кода Objective C, который взаимодействует с Какао, - это возможно использовать NSNotFound
, #define
для NSIntegerMax
, который используется по всему Какао, чтобы показать, что данное значение не существует в приемнике и т. д. (Другой вариант - использовать -1
, что более распространено в коде C. То, что работает лучше всего, зависит от того, что ожидает и может обработать вызывающий код.)
Хотя NSNotFound
является значением со знаком, оно достаточно велико, и вы вряд ли столкнетесь с проблемой диапазона. (NSIntegerMax
составляет примерно половину NSUIntegerMax
, и очень немногие люди удаленно приближаются к 2 147 483 647 объектам - не говоря уже о вдвое большем количестве - в 32-битной среде. В 64-битной версии забудьте об этом; физической памяти вашей машины задолго до того, как у вас закончатся целые числа для индексов.)
Говоря об этом, соглашение Какао должно использовать NSUInteger
(вместо NSInteger
) для индексов. Целое число без знака не может быть отрицательным, что обеспечивает некоторую разумную защиту для значений индекса; среди прочего, становится легче разобраться со случайным целочисленным переполнением / переполнением. Если это пользовательский метод источника данных (как кажется), я бы настоятельно рекомендовал перейти на использование целых чисел без знака. (Это может помочь вспомнить / понять, что NSInteger
и NSUInteger
занимают одинаковое количество байтов, они просто по-разному интерпретируют биты, поэтому вы не будете «тратить» пространство на переключение типов.)