В чем разница между NSInteger и NSNumber в Objective-C/Swift?

«В чем разница между NSInteger и NSNumber в Objective-C/Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

NSInteger — это псевдоним типа (typedef) для примитивного целочисленного типа (int на 32-битных и long на 64-битных архитектурах). Это скалярное значение, используемое для вычислений.

NSNumber — это класс-обёртка (boxing class), наследник от NSObject. Он инкапсулирует числовые скалярные типы (как NSInteger, так и Float, Double, BOOL и др.) в объект.

Ключевые различия: Критерий NSInteger NSNumber
Тип Скалярный тип (примитив) Объект (класс)
Назначение Арифметические операции, индексы, счётчики Хранение числа в объектных коллекциях (NSArray, NSDictionary), передача в API, ожидающие id/AnyObject
Производительность Высокая (работа в стеке) Ниже (выделение в куче, управление памятью)
Сравнение Операторы (==, <) Методы (isEqualToNumber:)

Пример использования:

// NSInteger — для вычислений
NSInteger a = 10;
NSInteger b = 20;
NSInteger sum = a + b;

// NSNumber — для хранения в коллекциях
NSNumber *numA = @(a); // Синтаксис литерала
NSNumber *numB = @(b);
NSArray *numbersArray = @[numA, numB]; // Массив объектов

// Извлечение значения обратно
NSInteger extractedValue = [numA integerValue];

В Swift: NSInteger соответствует Int, а NSNumber автоматически бриджится в числовые типы Swift, но может быть представлен как NSNumber для совместимости с Objective-C API.