Скаляр и поддержка структуры
Кодирование значения ключа предоставляет поддержку для скалярных значений и структур данных путем автоматического обертывания и разворачивания 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
экземпляры.
Обертывание и разворачивание структур
Таблица 2 показывает использование методов создания и методов доступа для обертывания общего NSPoint
, NSRange
, NSRect
, и NSSize
структуры.
Автоматическое обертывание и разворачивание не ограничены 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:
сообщение.