Константы NSNumber в Obj-C

Я хочу сделать некоторые константы NSNumber в том же стиле, что и для NSStrings в этом разделе . То есть я создаю отдельные файлы констант.h / .m и импортирую их в классы, которым необходимо получить к ним доступ.

Проблема с этим заключается в том, что нет такой вещи, как константа NSNumber. Только NSString получает это различие. NSNumbers всегда создаются динамически. Вы можете подделать его, используя функцию, запускаемую при запуске вашей программы, для инициализации переменных. Ваши варианты:

  1. Создайте класс с методом +load который выполняет инициализацию.

  2. В файл с константами включить функцию с __attribute__((constructor)) . Так, например:

     // Constants.m NSNumber *someGlobalNumber; __attribute__((constructor)) static void InitGlobalNumber() { someGlobalNumber = [[NSNumber numberWithInteger:1] retain]; } 

Но, конечно, вы не можете надежно использовать эти числа в любых других функциях, которые запускаются в начале процесса запуска. Обычно это не проблема, но стоит иметь в виду.

Другой вариант, который я видел несколько раз, заключается в том, чтобы иметь класс с accessors для чисел вместо того, чтобы давать необработанный доступ к переменным. Это немного более тяжелый дизайн, но он также чувствует себя менее вудуидным, у которого есть свои прелести.

К сожалению, вы не можете генерировать константы NSNumber же, как вы можете генерировать константы NSString . Когда вы попытаетесь сделать это, вы получите ошибку компилятора

 NSNumber * const kNumberConstant = @2; // This doesn't work. 

Однако вместо этого вы можете использовать примитивы.

 NSInteger const kSomeIntValue = 10; 

В основном вы можете достичь того, чего хотите в трех частях:

.h файл:

 extern NSNumber *MyFirstConstant; 

.m файл

 NSNumber *MyFirstConstant; 

AppDelegate.m

 +(void)initialize { MyFirstConstant = @5; ... } 

AppDelegate гарантированно запускается перед любым другим вашим кодом, а инициализация – это первый метод, который будет вызываться в AppDelegate, поэтому вы можете по существу обеспечить, чтобы все ваши константы были настроены для вас до запуска вашего приложения.

Обновить:

Годы спустя, я просто понял, что можно создать константу NSNumber для целых чисел … но это взломать:

 #define CONST_INT_NSNUMBER( x ) ((__bridge NSNumber * const)(void * const)(( x << 8 ) | 0x27)) NSNumber * const number = CONST_INT_NSNUMBER(123) ; 

Это работает, потому что некоторые целые NSNumbers хранятся как помеченные указатели .


оригинальный ответ:

Вы не можете этого сделать.

 NSNumber * const mynumber = @5.5; 

дает:

Элемент инициализатора не является константой времени компиляции

Предполагая, что у компилятора есть специальная функция, специально предназначенная для создания объектов NSString постоянной времени компиляции, но не любого другого типа объекта.

Вы могли бы сделать это, однако:

.h :

 extern NSNumber * kConstantNumber ; 

.m :

 NSNumber * kConstantNumber ; @implementation NSNumber (InitializeConstants) +(void)load { kConstantNumber = @42; // ... and the rest ... } @end 
  • Objective-C: определение типа объекта правильно в данных JSON
  • NSNumber хранится в NSUserDefaults
  • Почему литералы NSNumber не могут использоваться в статических объявлениях
  • NSNumber не сохраняется?
  • Преодоление «NSNumber» до предупреждения «Int»
  • Почему класс NSNumber правильно не конвертирует мой объект NSString в длинный?
  • Сохранение свойства enum внутри CoreData и его удобство
  • Арифметика NSNumber
  • Как определить истинный тип данных NSNumber?
  • Проверьте, не является ли NSNumber
  • Преобразование Double в NSNumber в Swift Loses Accuracy
  • Interesting Posts

    UITableview Set Multi Selection программно

    Как подделать прикосновение к стандартной клавиатуре iOS

    Анимация NSTextAttachment

    Ограничение на устройства iOS с A8 или лучшим графическим процессором

    Как загрузить изображения на сервер в iOS с помощью Swift?

    экспорт midi со звуковыми шрифтами на iOS

    Развертывание корпоративного приложения не работает на iOS 7.1

    iOS 6.0: UISplitViewController Popover сломан или дизайн, измененный Apple?

    Модальный вид с навигационным контроллером

    IB Designables не удалось обновить статус автомаркета

    xcodebuild exportArcive- Как настроить имя файла IPA по умолчанию при экспорте из командной строки?

    Где я должен сохранять данные и файлы, которые я хочу сохранить в долгосрочной перспективе, и как я могу предотвратить iCloud от их резервного копирования

    Как отображать Вход и отклонять настройки – Раскадровка

    как вычислить контрольные точки для гладкого пути с учетом множества точек?

    Уведомление Apple Push не работает на общем сервере

    Давайте будем гением компьютера.