antonio's blog

antonio's blog


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

antonio
Author

Share


Tags


Класс NSNumber

antonioantonio

Класс 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:

antonio
Author

antonio

Comments