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