У меня есть следующий метод UITableView DataSource:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
На некоторых объектах (т.е. раздел индексируют заголовки) я просто хочу "ничего" не возвратить, так, чтобы табличное представление не переходило ни к какому разделу. Я пытался возвратить ноль, но я добираюсь, "Возврат делает целое число из указателя без броска" - предупреждение, так как NSInteger является, очевидно, не объектом, просто определение типа для целых чисел на 32/64 бита.
Как я не могу достигнуть никакого возврата / реакция на определенных индексных заголовках раздела?
Возвращение nil
здесь является ошибкой, так как вы возвращаете целочисленный примитив, а не объект. (Вы получаете предупреждение, так как nil
на самом деле является #define
, который вычисляет в ((void *)0)
, что является нулевым указателем, а не целым нулем). Лучшим вариантом для кода Objective-C, который взаимодействует с Cocoa, вероятно, является использование NSNotFound
, #define
для NSIntegerMax
, который используется во всем коде Cocoa для обозначения того, что заданное значение не существует в приемнике и т.д. (Другой вариант - использовать -1
, что более распространено в коде C). То, что работает лучше всего, зависит от того, что ожидает код вызова и что он может обрабатывать.)
Хотя NSNotFound
является знаковым значением, оно достаточно большое, чтобы вряд ли вы столкнулись с проблемой диапазона. (NSIntegerMax
составляет примерно половину NSUIntegerMax
, и очень немногие люди удаленно приближаются к 2 147 483 647 объектам - не говоря уже о вдвое большем количестве - на 32-битной земле. В 64-битном случае забудьте об этом, у вас на машине закончится физическая оперативная память задолго до того, как закончатся целые числа для индексов)
Кстати говоря, конвенция Cocoa должна использовать NSUInteger
(а не NSInteger
) для индексов. Беззнаковое целое число не может быть отрицательным, что обеспечивает некоторую защиту от вменяемости значений индексов; кроме всего прочего, становится проще отсеивать случайное целочисленное переполнение/переполнение. Если это пользовательский метод источника данных (как кажется), то я настоятельно рекомендую перейти на использование беззнаковых целых чисел. (Может помочь вспомнить/реализовать, что NSInteger
и NSUInteger
занимают одно и то же количество байт, они просто по-разному интерпретируют биты, так что "тратить" место при переключении типов не будет)