Автоматически копировать значения свойств из одного объекта в другой другого типа, но с тем же протоколом (Objective-C) - PullRequest
4 голосов
/ 02 сентября 2011

У меня есть два класса с одинаковым набором свойств, объявленных с использованием директивы @property в протоколе, которые они оба реализуют. Теперь мне было интересно, можно ли автоматически заполнить экземпляр первого класса значениями из экземпляра второго класса (и наоборот). Мне бы хотелось, чтобы этот подход был надежным, чтобы при изменении свойств, объявленных в протоколе, не было необходимости добавлять дополнительный код в методы копирования.

1 Ответ

9 голосов
/ 02 сентября 2011

Да, учитывая точный контекст, могут быть различные подходы к этой проблеме.

В данный момент я могу думать о том, чтобы сначала получить все свойства исходного объекта, а затем использовать setValue:value forKey:key для установки значений для целевого объекта.

Код для извлечения всех пользовательских свойств:

-(NSSet *)propertyNames {
  NSMutableSet *propNames = [NSMutableSet set];
  unsigned int outCount, i;
  objc_property_t *properties = class_copyPropertyList([self class], &outCount);
  for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    NSString *propertyName = [[[NSString alloc] 
      initWithCString:property_getName(property)] autorelease];
    [propNames addObject:propertyName];
  }
  free(properties);

  return propNames;
}

Для получения дополнительной информации вы можете обратиться к Руководству по программированию кодирования значения ключа .

...