antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Anton Dobkin
Author

Share


Tags


Класс NSNumber

Anton DobkinAnton Dobkin

Класс NSNumber является подклассом NSValue, объекты которого позволяют хранить значения скалярных числовых типов языка С. Класс добавляет набор методов для установки и чтения знаковых и без знаковых числовых типов, к которым относятся: char, short int, int, long int, long long int, float, double, NSInteger, BOOL. Объекты класса являются неизменяемыми (immutable)

Класс принимает следующие протоколы:

Создание объектов

Объекты класса NSNumber можно создавать с помощью литералов, используя символ '@' :

NSNumber *nineFromInteger = @9;  
NSNumber *tenFromFloat = @10.0;  
NSNumber *nineteenFromExpression = @(9 + 10);  

Литералы для NSNumber доступны в Xcode 4.4 и при использовании компилятора Apple LLVM 4.0. Использование литералов самый простой способ создания объектов. Помимо литералов, для создания объектов, можно воспользоваться одним из следующих методов класса NSNumber:

+ numberWithBool: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа BOOL

+ numberWithChar: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа char

+ numberWithDouble: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа double

+ numberWithFloat: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа float

+ numberWithInt: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа int

+ numberWithInteger: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа NSInteger значение

+ numberWithLong: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа long int

+ numberWithLongLong: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа long long int

+ numberWithShort: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа short int

+ numberWithUnsignedChar: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа unsigned char

+ numberWithUnsignedInt: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа unsigned int

+ numberWithUnsignedInteger: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа NSUInteger

+ numberWithUnsignedLong: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа unsigned long int

+ numberWithUnsignedLongLong: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа unsigned long long int

+ numberWithUnsignedShort: - создает и возвращает объект класса NSNumber, содержащий указанное значение, рассматриваемое как значение типа unsigned short int

Пример:

NSNumber *number = [NSNumber numberWithLong: -277];  
NSLog(@"%@", number)  
//...
NSNumber *number = [NSNumber numberWithChar: 'h'];  
NSLog(@"%@", number)  

Инициализация объектов

Методы инициализации объектов класса NSNumber:

- initWithBool: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа BOOL

- initWithChar: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа char

- initWithDouble: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа double

- initWithFloat: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа float

- initWithInt: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа int

- initWithInteger: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа NSInteger

- initWithLong: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа long int

- initWithLongLong: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа long long int

- initWithShort: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа short int

- initWithUnsignedChar: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа unsigned char

- initWithUnsignedInt: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа unsigned int

- initWithUnsignedInteger: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа NSUInteger

- initWithUnsignedLong: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа unsigned long int

- initWithUnsignedLongLong: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа unsigned long long int

- initWithUnsignedShort: - инициализирует ранее созданный объект указанным значением, рассматриваемым как значение типа unsigned short int

Пример

NSNumber *number = [[NSNumber alloc] initWithLong: -277];  
NSLog(@"%@", number)  
//...
NSNumber *number = [NSNumber alloc] initWithChar: 'h'];  
NSLog(@"%@", number)  

Доступ к значениям

Методы доступа:

- boolValue - возвращает значение текущего объекта, как значение типа BOOL. При необходимости значение объекта будет приведено к значению типа BOOL

- charValue - возвращает значение текущего объекта, как значение типа char. При необходимости значение объекта будет приведено к значению типа char

- decimalValue - возвращает значение текущего объекта, как структуру NSDecimal.

- doubleValue - возвращает значение текущего объекта, как значение типа double. При необходимости значение объекта будет приведено к значению типа double

- floatValue - возвращает значение текущего объекта, как значение типа float. При необходимости значение объекта будет приведено к значению типа float

- intValue - возвращает значение текущего объекта, как значение типа int. При необходимости значение объекта будет приведено к значению типа int

- integerValue - возвращает значение текущего объекта, как значение типа NSInteger. При необходимости значение объекта будет приведено к значению типа NSInteger

- longLongValue - возвращает значение текущего объекта, как значение типа long long int. При необходимости значение объекта будет приведено к значению типа long long int

- longValue - возвращает значение текущего объекта, как значение типа long int. При необходимости значение объекта будет приведено к значению типа long int

- shortValue - возвращает значение текущего объекта, как значение типа short int. При необходимости значение объекта будет приведено к значению типа short int

- unsignedCharValue - возвращает значение текущего объекта, как значение типа unsigned char. При необходимости значение объекта будет приведено к значению типа unsigned char

- unsignedIntegerValue - возвращает значение текущего объекта, как значение типа NSUInteger. При необходимости значение объекта будет приведено к значению типа NSUInteger

- unsignedIntValue - возвращает значение текущего объекта, как значение типа unsignde int. При необходимости значение объекта будет приведено к значению типа unsigned int

- unsignedLongLongValue - возвращает значение текущего объекта, как значение типа unsigned long long int. При необходимости значение объекта будет приведено к значению типа unsigned long long int

- unsignedLongValue - возвращает значение текущего объекта, как значение типа unsigned long int. При необходимости значение объекта будет приведено к значению типа unsigned long int

-unsignedShortValue - возвращает значение текущего объекта, как значение типа unsigned short int. При необходимости значение объекта будет приведено к значению типа unsigned short int

NSNumber сохраняет числовой тип с которым был создан или инициализирован объект класса и использует те же правила приведения числовых типов, что и C. В можете запросить значение объекта с типом отличным от типа исходного числового значения:

NSNumber *nineFromInt = @9;  
NSNumber *tenFromFloat = @-10.0;

float nineFromFloat = [nineFromInt floatValue];  
NSLog(@"%f",  nineFromFloat); // Выведет: 9.0

unsigned int tenFromInt = [tenFromFloat unsignedIntValue];  
NSLog(@"%d",  tenFromInt); // Выведет: 10  

Если запросить у экземпляра NSNumber значение с приведением к типу, который не может разместить запрашиваемое значение, то будет возвращен ошибочный результат. Например:

NSNumber *bigNumber = @(FLT_MAX);  
NSInteger badInt = [bigNumber intValue];  
NSLog(@"bigNumber: %@; badInteger: %d", bigNumber, badInt);  
// Вывод: "bigNumber: 3.402823e+38; badInteger: 0"

Мы создали объект класса NSNumber и сохранили в нем максимальное значение для чисел с плавающей запятой, а потом запросили это значение как число с типом NSInteger. NSInteger не в состоянии разместить запрошенное значение.

Получение строковых представлений

Методы для получения строковых представлений сохраненных числовых значений:

-stringValue - возвращает значение в виде человекопонятной строки

-descriptionWithLocale: - возвращает значение в виде человекопонятной строки в указанной локализации.

Сравнение объектов

Методы сравнения объектов NSNumber:

- compare: - метод сравнивает текущий объект с указанным. Метод возвращает значение с типом NSComparisonResult:

При сравнении объектов с разными типами значения используются те же правила приведения типов, что и в С. Значение аргумента не может быть nil.

NSNumber *a = @18.5f;  
NSComparisonResult result = [a compare:@18];

NSLog(@"%ld", result);  

-isEqualToNumber: - метод сравнивает текущий объект с указанным и возвращает булево значение: YES, если объекты равны, иначе NO. Два объекты NSNumber считаются равными, если они имеют одинаковые id или, если они содержат одинаковые значения. Этот метод эффективнее, чем compare:

Anton Dobkin
Author

Anton Dobkin

Comments