Скаляр и поддержка структуры

Кодирование значения ключа предоставляет поддержку для скалярных значений и структур данных путем автоматического обертывания и разворачивания NSNumber и NSValue значения экземпляра.

Представление необъектных значений

Реализации по умолчанию valueForKey: и setValue:forKey: предоставьте поддержку для автоматического объектного обертывания нетипов данных Object, и скаляры и структуры.

Один раз valueForKey: определил определенный метод доступа или переменную экземпляра, использующуюся для предоставления значения для указанного ключа, это исследует тип возврата или тип данных. Если значение объектом, которое будет возвращено не является NSNumber или NSValue объект создается для того значения и возвращается в его месте.

Точно так же setValue:forKey: определяет тип данных, требуемый надлежащим средством доступа или переменной экземпляра для указанного ключа. Если тип данных не является объектом, то значение извлечено из переданного объекта с помощью надлежащего -<type>Value метод.

Обработка нулевых Значений

Дополнительная проблема возникает когда setValue:forKey: вызывается с nil переданный как значение для несвойства объекта. Нет никакого обобщенного действия, которое является надлежащим. Получатель отправляется a setNilValueForKey: сообщение, когда nil передается как значение для несвойства объекта. Реализация по умолчанию setNilValueForKey: повышения NSInvalidArgumentException исключение. Подкласс может переопределить этот метод для обеспечения надлежащей реализации определенное поведение.

Пример кода в Перечислении 1 реагирует на попытку установить возраст лица, значение плавающее, к a nil значение, вместо этого устанавливая возраст в 0.

  Реализация перечисления 1 В качестве примера setNilValueForKey:

- (void)setNilValueForKey:(NSString *)theKey
{
    if ([theKey isEqualToString:@"age"]) {
        [self setValue:[NSNumber numberWithFloat:0.0] forKey:@”age”];
    } else
        [super setNilValueForKey:theKey];
}

Обертывание и разворачивание скалярных типов

Таблица 1 перечисляет скалярные типы, обертывающиеся с помощью NSNumber экземпляры.

Табличный 1  Скаляр вводит, как обернуто в NSNumber объекты

Тип данных

Метод создания

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

BOOL

numberWithBool:

boolValue

char

numberWithChar:

charValue

double

numberWithDouble:

doubleValue

float

numberWithFloat:

floatValue

int

numberWithInt:

intValue

long

numberWithLong:

longValue

long long

numberWithLongLong:

longLongValue

short

numberWithShort:

shortValue

unsigned char

numberWithUnsignedChar:

unsignedChar

unsigned int

numberWithUnsignedInt:

unsignedInt

unsigned long

numberWithUnsignedLong:

unsignedLong

unsigned long long

numberWithUnsignedLongLong:

unsignedLongLong

unsigned short

numberWithUnsignedShort:

unsignedShort

Обертывание и разворачивание структур

Таблица 2 показывает использование методов создания и методов доступа для обертывания общего NSPoint, NSRange, NSRect, и NSSize структуры.

Таблица 2  Общая структура вводит, как обернуто использование NSValue.

Тип данных

Метод создания

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

NSPoint

valueWithPoint:

pointValue

NSRange

valueWithRange:

rangeValue

NSRect

valueWithRect: (Только OS X).

rectValue

NSSize

valueWithSize:

sizeValue

Автоматическое обертывание и разворачивание не ограничены NSPoint, NSRange, NSRect, и NSSize— типы структуры (т.е. типы, строки кодирования типа Objective C которых запускаются с {) может быть обернут в NSValue объект. Например, если у Вас есть структура и класс как это:

typedef struct {
    float x, y, z;
} ThreeFloats;
 
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end

Отправка экземпляра MyClass сообщение valueForKey: с параметром @"threeFloats" вызовет MyClass метод threeFloats и возвратите результат, обернутый в NSValue. Аналогично отправляя экземпляр MyClass a setValue:forKey: сообщение с NSValue объект, переносящийся a ThreeFloats структура вызовет setThreeFloats: и передайте результат отправки NSValue объект a getValue: сообщение.