Как вообще обрабатывать объекты класса, которые отличаются только инициализированными свойствами? - PullRequest
2 голосов
/ 04 марта 2010

Мне нравится идея абстрагирования CellControllers в гетерогенном UITableView , предложенная Мэттом Галлахером . Однако в случае типичного поведения push-detail-view я создаю почти идентичные варианты LinkRowCellController, которые отличаются только методами init контроллеров детального представления - init:, initWithBook:, * 1007. *, initWithHelpURLString:andTopic: и т. Д.

Кажется, что я мог бы изменить назначенный инициализатор, чтобы он брал словарь ключей свойств и начальных аргументов и чтобы метод LinkRowCellController initWithProperties: устанавливал свойства, используя setValueForKey: для передаваемых пар.

Это решение, похоже, отказывается от проверки аргументов init во время компиляции. Какова лучшая практика в Objective-C для разнородных элементов в остальном однородном коде?

UPDATE:

Основываясь на ответе ниже, я реализовал суперкласс с единственным методом initWithDictionary:(NSDictionary *)dict, от которого все наследует:

- (id)initWithDictionary:(NSDictionary *)dict
{
 if ((self = [super init]) != nil)
 {
  for (id key in dict) {
   [self setValue:[dict objectForKey:key] forKey:key];
  }
 }
 return self;
}

1 Ответ

2 голосов
/ 06 марта 2010

Нередко в таких ситуациях используется метод -initWithDictionary:.Однако все, что вам понадобится для значений свойств, будет -initWithObject: - нет необходимости переводить книгу или журнал в словарь, поскольку вы можете при необходимости отправлять -valueForKey: непосредственно в сами объекты модели.,(См. NSKeyValueCoding для более подробной информации.)

Но у меня возникнет соблазн инициализировать CellController со словарем, содержащим информацию о конфигурации, такую ​​как заголовки и нижние колонтитулы для группы, а также настройки для отдельных ячеек, такие какаксессуар, путь к файлу изображения, ключевые пути для значений модели и т. д. Это откроет путь к использованию plist-файла для информации о конфигурации для ваших CellControllers (которую я хотел бы назвать CellGroups, потому что они на самом деле просто группыячеек - но это только я).

И тогда, да, вы будете торговать во время компиляции, проверяя гибкость и уменьшение размера кода.Но опять же, это сценарий быстрого отказа (т. Е. Вы сразу же получите ошибки во время выполнения, когда будете искать ключевой путь), поэтому я думаю, что это довольно приличный компромисс.Взамен, когда вам нужно добавить новое представление таблицы, все, что вам нужно сделать, это создать новый список.И вы могли бы инициализировать свои CellGroups следующим образом:

- (id)initWithObject:(id)anObject configurationInfo:(NSDictionary *)info;

(И, да, вы можете просто вставить объект в словарь, но я не вижу в этом победы, особенно если словарьизвлекается путем чтения plist из файловой системы.)

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