Объект класса 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, может быть использован в вычислениях благодаря целому ряду имеющихся в нем арифметических методов (или эквивалентных им функциям С, которые действуют быстрее). Это особенно полезно для округления чисел, поскольку имеется удобный способ указать требующийся режим округления.


 

 

 

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