Объект класса NSNumber заключает в себе числовое значение, в том числе и логическое значение BOOL.

Следовательно, его можно использовать для хранения и передачи числа там, где предполагается получить объект. Объект класса NSNumber образуется из конкретного числа с помощью метода, обозначающего числовой тип. Например, для того чтобы образовать число из целочисленного значения int, можно вызвать метод numberWithlnt: следующим образом:

[[NSUserDefaults standardUserDefaults] registerDefaults:

[NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithlnt: 4],

@"cardMatrixRows",

[NSNumber numberWithlnt: 3],

@"cardMatrixColumns", nil]];

Как упоминалось в главе 5, в компиляторе LLVM версии 4.0 (в среде Xcode 4.4) используется новый синтаксис для получения нового экземпляра класса NSNumber. Для этого нужно соблюсти следующие условия.

  • Предварить числовой литерал (или логическое значение BOOL) знаком @. Для дополнительного обозначения числового типа после числового литерала следует указать U (целое число без знака), L (целое длинное число), LL (целое число двойной длины) или F (число с плавающей точкой). Например, числовое значение @3.1415 равнозначно значению [NSNumber numberWithDouble: 3 Л 415], а логическое значение 0YES — значению [NSNumber numberWithBool: YES ].
  • Если выражение дает числовое значение, заключить его в круглые скобки, предварив открывающую скобку знаком @. Так, если высота и ширина представлены числами с плавающей точкой, то выражение @ (height/width) равнозначно [NSNumber numberWithFloat: height/width].

Таким образом, приведенный выше пример кода можно переписать следующим образом:

[[NSUserDefaults standardUserDefaults] registerDefaults:

(NSDictionary dictionaryWithObjectsAndKeys:

@4,

@"cardMatrixRows",

@3,

@"cardMatrixColuirmsn, nil]];

 

(Синтаксис литералов поддерживается также в классе NSDictionary. Как будет показано далее, приведенный выше код можно написать еще компактнее.)

Сам объект типа NSNumber не является числом, и поэтому его нельзя использовать в вычислениях или там, где предполагается получить конкретное число. Вместо этого приходится извлекать число явным образом из оболочки объекта типа NSNumber, используя метод, выполняющий действие, обратное заключению числа в оболочку данного объекта. Выбор этого метода оставляется на ваше усмотрение. Так, если объект типа NSNumber заключает в оболочку числовое значение типа int„ можно вызвать метод intValue, чтобы извлечь это значение, как показано ниже.

{code}

NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];

int           therows =             [[ud objectForKey:@"cardMatrixRows"] intValue];

int           thecols   =             [[ud objectForKey:@"cardMatrixColumns"] intValue];

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

NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];

int           therows =             [ud integerForKey^"cardMatrixRows"];

int           thecols   =             [ud integerForKey:@"cardMatrixColumns"];

С другой стороны, подкласс NSDecimalNumber, производный от класса NSNumber, может быть использован в вычислениях благодаря целому ряду имеющихся в нем арифметических методов (или эквивалентных им функциям С, которые действуют быстрее). Это особенно полезно для округления чисел, поскольку имеется удобный способ указать требующийся режим округления.


Похожие статьи

 

 

 

 
 

Добавить комментарий


Защитный код
Обновить