Создание объекта Objective-C, который включает другой объект с тем же интерфейсом - проблемы KVC / KVO

StackOverflow https://stackoverflow.com/questions/3568819

Вопрос

Мне нужно создать объект в одной классе иерархии, которая обертывает объект от другого. У них оба имеют очень похожие интерфейсы, и я хотел бы автоматически иметь передовые сообщения о бортке, оно не распознает ее цель вместо реализации своих собственных свойств. Я получил это, чтобы работать, используя что-то вроде этого:

- (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 - ключ плюс толстой кишки. Однако проблема с этим является свойствами, которые имеют разное имя добыча / настройки. Первый вариант определенно лучший.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top