У меня есть строка кода, которая будет работать по-разному в зависимости от типов данных "день" и "1". Я считаю, что это следующее, хотя позже я проверю свой исходный код.
day = day + 1;
У меня есть строка кода, которая будет работать по-разному в зависимости от типов данных "день" и "1". Я считаю, что это следующее, хотя позже я проверю свой исходный код.
day = day + 1;
NSInteger
- это определение типа, которое описывает целое число, но оно НЕ эквивалентно int
на 64-разрядных платформах.
Вы можете проверить typedef, нажав cmd на NSInteger
в Xcode. NSInteger
определяется как int
при создании 32-разрядного приложения и long
для 64-разрядных приложений.
В большинстве случаев вы можете заменить int на NSInteger, но при этом нужно учитывать некоторые вещи.
Руководство по переходу на 64-разрядное устройство Apple для Cocoa содержит некоторую информацию об этом.
NSNumber - это класс, который поможет вам хранить числовые типы в качестве объекта. Он имеет методы для преобразования между различными типами и методами для получения строкового представления вашего числового значения.
Если вы используете переменную day
типа NSNumber*
, как вы это делали в своем примере, вы не изменяете значение day
, а его адрес памяти.
Если вы работаете со значениями времени, вы также можете взглянуть на NSDate.
NSInteger
является просто целым числом, NSNumber
является объектом, где int
является примитивным типом данных.
NSInteger - не более чем синоним длинного целого числа.
Если вам нужно где-то сохранить номер, используйте NSNumber. Если вы выполняете вычисления, циклы и т.д., Используйте NSInteger, NSUInteger или int.
Вы можете обернуть NSInteger в NSNumber, используя:
NSNumber *NumberToStore = @(21);
и верните его, используя:
NSInteger retrievingInteger = [NumberToStore integerValue];
1
является литералом, и компилятор сделает его соответствующим числовым типом, если это необходимо.
Обратите внимание, однако, что в то время как NSInteger
и int
для большинства целей и целей одно и то же, NSNumber
является типом объекта. В этом случае ваш код не имеет смысла (и не должен компилироваться без предупреждений).
(На самом деле, есть некоторые обстоятельства, когда он будет иметь какой-то смысл в терминах арифметики указателя, но это совсем не то, что вы хотите.)
В случае с NSNumber вы хотели бы получить что-то вроде:
day = [NSNumber numberWithInt:[day intValue] + 1];
NSInteger
и int
эквивалентны, NSNumber
- это объект, используемый для хранения примитивных типов номеров (int, long, float и т.д.).
Код примера, который вы опубликовали, будет отлично работать, если day
является NSInteger
, он не будет работать вообще, если он NSNumber
.