2013-05-04 4 views
1

Это кажется почти новым надмножеством над Objective-C, с комбинациями точечной нотации, смешанной с директивами, например: [email protected](...) и синтаксисом соответствия, например: -replaceObjectIn<Key>AtIndex:withObject:. Похоже, что большая часть KVC сродни простым методам доступа, которые могут быть синтезированы в любом случае. Однако я скажу, что KVObserving, похоже, упрощает работу с приложениями MVC. Мнения?Когда стоит KVC & KVO? Всегда?

ответ

4

Ключевое значение кодирования позволяет вам искать произвольно вложенные атрибуты, идентификация которых известна только во время выполнения. Например, KVC не является хорошей заменой для person.name - для этой конкретной задачи это необязательно. Но скажем, мы не знали, когда писали нашу программу, хотим ли мы искать имя, возраст или любимый бренд обуви. Мы часто сталкиваемся с такими вещами с источниками данных NSTableView. Мы могли бы написать большой, повторяющиеся условные отправить сообщение, которое мы хотим, но КВЦ делает его легко:

return [personController.selectedPerson valueForKeyPath:desiredAttribute]; 

Тогда мы можем установить desiredAttribute к @"name", @"age" или @"favoriteShoeBrand.name", и мы получим правильное значение без ветвления даже хотя мы знаем только атрибут, который мы хотим во время выполнения.

Это также полезно, потому что классы могут обрабатывать KVC особыми способами. Например, NSArray делает что-то действительно приятное. [arrayOfPeople valueForKeyPath:@"name"] не эквивалентен arrayOfPeople.name - вместо этого он проходит по пути к каждому объекту и создает новый массив с результатами этого. Таким образом, он выполняет те же самые цели, что и функция отображения на многих других языках. Существуют также специальные операторы KVC, такие как @distinctUnionOfArrays (который берет набор массивов и объединяет их вместе, игнорируя дубликаты), которые делают работу с вложенными коллекциями таким образом намного более краткими, чем в противном случае.

Что касается KVO, это всего лишь способ получить уведомление, когда что-то изменится - так, например, вы можете обновить свой пользовательский интерфейс с новым возрастом в день рождения человека без пользовательского интерфейса, который должен знать о логике дня рождения. Если вам это будет полезно, вам, вероятно, понравится.