Основные принципы кодирования значения ключа
Эта статья описывает основные принципы кодирования значения ключа.
Ключи и ключевые пути
Ключ является строкой, идентифицирующей определенное свойство объекта. Как правило, ключ соответствует имени метода доступа или переменной экземпляра в принимающем объекте. Ключи должны использовать кодирование ASCII, начаться со строчной буквы и могут не содержать пробел.
Некоторые ключи в качестве примера были бы payee
, openingBalance
, transactions
и amount
.
Ключевой путь является строкой разделенных ключей точки, использующейся для указания последовательности свойств объектов для пересечения. Свойство первого ключа в последовательности относительно получателя, и каждый последующий ключ оценен относительно значения предыдущего свойства.
Например, ключевой путь address.street
получил бы значение address
свойство от принимающего объекта, и затем определяет street
свойство относительно address
объект.
Получение значений атрибута Используя кодирование значения ключа
Метод valueForKey:
возвращает значение для указанного ключа, относительно получателя. Если нет никакого средства доступа или переменной экземпляра для указанного ключа, то получатель отправляет себе a valueForUndefinedKey:
сообщение. Реализация по умолчанию valueForUndefinedKey:
повышения NSUndefinedKeyException
; подклассы могут переопределить это поведение.
Точно так же valueForKeyPath:
возвращает значение для указанного ключевого пути, относительно получателя. Любой объект в ключевой последовательности пути, которая не является значением ключа, кодирующим совместимый для надлежащего ключа, получает a valueForUndefinedKey:
сообщение.
Метод dictionaryWithValuesForKeys:
получает значения для массива ключей относительно получателя. Возвращенный NSDictionary содержит значения для всех ключей в массиве.
Когда значение возвращается для ключевого пути, содержащего ключ для к - многие свойство, и что ключ не является последним ключом в пути, возвращенное значение является набором, содержащим все значения для ключей направо от к - многие вводят. Например, запрашивая значение ключевого пути transactions.payee
возвращает массив, содержащий весь payee
объекты, для всех транзакций. Это также работает на многократные массивы по ключевому пути. Ключевой путь accounts.transactions.payee
возвратил бы массив со всеми объектами получателя платежа, для всех транзакций, во всех учетных записях.
Установка значений атрибута Используя кодирование значения ключа
Метод setValue:forKey:
устанавливает значение указанного ключа, относительно получателя, к предоставленному значению. Реализация по умолчанию setValue:forKey:
автоматически разворачивает NSValue
объекты, представляющие скаляры и структуры и присваивающие их свойству. Посмотрите Поддержку Скаляра и Структуры подробных данных об обертывании и разворачивании семантики.
Если указанный ключ не существует, получатель отправляется a setValue:forUndefinedKey:
сообщение. Реализация по умолчанию setValue:forUndefinedKey:
повышения NSUndefinedKeyException
; однако, подклассы могут переопределить этот метод для обрабатывания запроса пользовательским способом.
Метод setValue:forKeyPath:
ведет себя подобным способом, но он в состоянии обработать ключевой путь, а также единственный ключ.
Наконец, setValuesForKeysWithDictionary:
устанавливает свойства получателя со значениями в указанном словаре, с помощью ключей словаря для идентификации свойств. Реализация по умолчанию вызывает setValue:forKey:
для каждой пары ключ/значение, занимая место nil
для NSNull
объекты как требуется.
Одна дополнительная проблема, которую необходимо рассмотреть, - то, что происходит, когда попытка предпринята для установки несвойства объекта в нулевое значение. В этом случае получатель отправляет себе a setNilValueForKey:
сообщение. Реализация по умолчанию setNilValueForKey:
повышения NSInvalidArgumentException
. Ваше приложение может переопределить этот метод, чтобы заменить значением по умолчанию или значением маркера, и затем вызвать setValue:forKey:
с новым значением.
Точечное кодирование синтаксиса и значения ключа
Точечный синтаксис Objective C и кодирование значения ключа являются ортогональными технологиями. Можно использовать кодирование значения ключа, используете ли Вы точечный синтаксис, и можно использовать точечный синтаксис, используете ли Вы KVC. Оба, тем не менее, используют “точечный синтаксис”. В случае кодирования значения ключа синтаксис используется для разграничивания элементов по ключевому пути. Помните при доступе к свойству с помощью точечного синтаксиса вызов стандартных методов доступа получателя.
Можно использовать методы кодирования значения ключа для доступа к свойству, например, учитывая класс, определенный следующим образом:
@interface MyClass |
@property NSString *stringProperty; |
@property NSInteger integerProperty; |
@property MyClass *linkedInstance; |
@end |
Вы могли получить доступ к свойствам в экземпляре с помощью KVC:
MyClass *myInstance = [[MyClass alloc] init]; |
NSString *string = [myInstance valueForKey:@"stringProperty"]; |
[myInstance setValue:@2 forKey:@"integerProperty"]; |
Для иллюстрирования различия между свойствами отмечают точкой синтаксис и пути ключа KVC, рассматривают следующий.
MyClass *anotherInstance = [[MyClass alloc] init]; |
myInstance.linkedInstance = anotherInstance; |
myInstance.linkedInstance.integerProperty = 2; |
Это имеет тот же результат как:
MyClass *anotherInstance = [[MyClass alloc] init]; |
myInstance.linkedInstance = anotherInstance; |
[myInstance setValue:@2 forKeyPath:@"linkedInstance.integerProperty"]; |