← Назад к вопросам

В чем разница между NSInt от NSNumber?

1.3 Junior🔥 101 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между int (или NSInteger) и NSNumber

Вопрос касается фундаментального различия между примитивными типами данных и объектами-оберточными классами в Objective-C и Swift. Правильная терминология: в Objective-C используется NSInteger (или просто int), а NSNumber — это класс из Foundation.

NSInteger / int — Примитивный тип данных

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

  • Представляет: Простое числовое значение (например, 42, -5).
  • Хранение: В стеке или как часть структуры объекта.
  • Операции: Все стандартные арифметические операции (+, -, *, /) и сравнения работают напрямую.
  • Использование: Для счетчиков, индексов, вычислений в циклах — там, где нужна высокая производительность.
NSInteger primitiveInt = 42;
primitiveInt += 10; // Прямая операция
BOOL isGreater = primitiveInt > 50;

NSNumber — Объект-обертка (Wrapper Class)

NSNumber — это класс из Foundation, наследник NSValue. Он является объектом, который "оборачивает" (инкапсулирует) числовое значение примитивного типа (int, float, double, BOOL и др.).

  • Представляет: Объект, который содержит числовое значение.
  • Хранение: Как объект в динамической памяти (heap). Управляется счетчиком ссылок (ARC) или ручным управлением памятью.
  • Операции: Не поддерживает прямые арифметические операции. Чтобы получить значение, нужно вызвать метод (например, intValue, doubleValue). Для сравнения используется метод compare: или получение значения.
  • Ключевое назначение: Использование в коллекциях (NSArray, NSDictionary, NSSet), поскольку они могут хранить только объекты (id), а не примитивы.
// Создание объекта-обертки для значения
NSNumber *numberObject = @42; // Синтаксис литерала Boxed Expression (Modern Objective-C)
NSNumber *anotherNumber = [NSNumber numberWithInt:42];

// Получение примитивного значения из объекта
int unwrappedInt = [numberObject intValue];

// Использование в коллекции (ОСНОВНАЯ причина)
NSArray *array = @[@1, @2, @3]; // Массив объектов NSNumber
NSDictionary *dict = @{ @"age": @30 }; // Значение в словаре должно быть объектом

Сравнение в таблице

КритерийNSInteger / int (Примитив)NSNumber (Объект)
ТипПримитивный тип данных CКласс Objective-C (NSObject)
ХранениеСтек / прямая памятьДинамическая память (heap)
ПроизводительностьВысокая (операции прямые)Ниже (аллокация объекта, вызов методов)
АрифметикаПрямые операторы (+, -, etc.)Не поддерживается. Нужно извлекать значение.
СравнениеОператоры сравнения (>, ==)Метод compare: или извлечение значения
Использование в коллекцияхНевозможно (требуется "обертка")Основное предназначение
Совместимость с SwiftIntNSNumber (в Swift работает как AnyObject или через as Int)

Конвертация и современный синтаксис

Из примитива в объект (Boxing):

NSInteger primitive = 100;
NSNumber *object = @(primitive); // Boxed Expression

Из объекта в примитив (Unboxing):

NSNumber *object = @200;
NSInteger primitive = [object integerValue];

Swift Context

В Swift это различие смягчено, но концепция остается:

  • Int — это структура (примитивный тип в Swift).
  • NSNumber — это класс, используемый при работе с Objective-C API или для хранения гетерогенных числовых типов. Swift обеспечивает автоматическую bridging между Int и NSNumber в большинстве контекстов.
let swiftInt: Int = 5
let nsNumber: NSNumber = swiftInt as NSNumber // Бридинг
let backToInt: Int = nsNumber as! Int

Итог: NSInteger/int — это "число как значение", используемое для вычислений. NSNumber — это "число как объект", созданное прежде всего для интеграции числовых значений в объектно-ориентированные системы коллекций Foundation и передачи через API, основанные на NSObject. Понимание этого различия критично для эффективной работы с памятью, производительностью и API Cocoa.

В чем разница между NSInt от NSNumber? | PrepBro