Создание объекта Objective-C, который включает другой объект с тем же интерфейсом - проблемы KVC / KVO
-
01-10-2019 - |
Вопрос
Мне нужно создать объект в одной классе иерархии, которая обертывает объект от другого. У них оба имеют очень похожие интерфейсы, и я хотел бы автоматически иметь передовые сообщения о бортке, оно не распознает ее цель вместо реализации своих собственных свойств. Я получил это, чтобы работать, используя что-то вроде этого:
- (ID) ForervingTargetForselector: (SEL) SEL {Если ([Self.wrappyObject Repentstoselector: SEL]) возврат Self.wrappyObject; вернуть себя; }
Но это не работает для кодирования ключа. Как я могу пойти, имея мою оболочку в реализации кодирования ключа-значений таким образом, чтобы использовать свойства его обернутого объекта?
Решение
Вам придется перезаписать valueForKey:
а также setValue:forKey:
. Отказ Пример:
- (id)valueForKey:(NSString *)key {
if (/* wrapped object has key */)
return [self.wrappedObject valueForKey: key];
else
return [super valueForKey: key];
}
Сложная часть будет определить ключи, которые включают в себя завернутый объект. Легкий способ - это сложный код, но это не слишком хорошо. Если вы хотите сделать это очень общим, вы сделаете что-то используя APIS Repliction Of Objective-C. Вот две идеи:
Все ваши свойства фактически объявлены свойствами. Вы можете использовать функцию выполнения Class_GetProperty, чтобы проверить его существование и необязательно извлечь дополнительную информацию. Проверка могла тогда выглядеть так:
if (class_getProperty([self.wrappedObject class], [key UTF8String]) != nil) {...}
.Ваши свойства могут также иметь доступ к аксессуару. Затем вы должны построить селекторы из ключа и использовать
[self.wrappedObject respondsToSelector: ...]
Так же, как вы делали раньше. Имя GETTER - ключ плюс толстой кишки. Однако проблема с этим является свойствами, которые имеют разное имя добыча / настройки. Первый вариант определенно лучший.