Я согласен с тем, куда идет Андрей, но я считаю, что это еще проще. Вам просто нужны типы декораторов, и, как вы их описали, они должны быть простыми структурами, без необходимости в протоколах.
struct MyCellDecorator {
let headingText: String
let descriptionText: String
}
(я сделал их необязательными, и я настоятельно рекомендую, если только у вас нет различия пользовательского интерфейса между «пустой строкой» и «нет».)
Расширения работают почти так же, как и раньше:
extension MyDataClass {
func makeMyCellDecorator() -> MyCellDecorator {
return MyCellDecorator(headingText: "Some Heading",
description: "Some Description")
}
}
В некоторых случаях вы можете обнаружить, что объекты модели имеют очень согласованные способы создания декоратора. Это место, где протоколы позволят вам извлечь код, такой как:
protocol MyCellDecoratorConvertible {
var headingText: String { get }
var descriptionText: String { get }
}
extension MyCellDecoratorConvertible {
func makeMyCellDecorator() -> MyCellDecorator {
return MyCellDecorator(headingText: headingText,
description: description)
}
}
В этом примере показан случай, когда ячейка уже имеет точно правильные имена. Тогда вам просто нужно добавить MyCellDecoratorConvertible, и собственность предоставляется бесплатно.
Ключевым моментом для всего этого является то, что вместо model.headingText
у вас будет model.makeMyCellDecorator().headingText
, который будет учитывать ваш взрыв свойств.
Обратите внимание, что при каждом обращении к нему будет создаваться новый Декоратор, поэтому я использую make
( factory ) соглашение об именах. Есть и другие подходы, которые вы могли бы рассмотреть, например ластик типа AnyMyCellDecorator
(но я бы начал с простого; это, вероятно, очень маленькие типы, и их копирование не дорого).
Вы можете разделить пользовательский интерфейс на модули и использовать внутренние расширения. Они не появятся в других модулях, что предотвратит появление myCellDecorator
везде. Если вам удобнее, вы можете поместить расширения myCellDecorator
в один файл с MyCell и пометить их как частные.
Поскольку это большая существующая кодовая база, я настоятельно рекомендую разрешить любое существующее дублирование кода для управления вашим дизайном. Не существует единого шаблона, который идеально подходит для всех систем. Нет необходимости даже в том, чтобы каждый декоратор следовал одному и тому же шаблону (в некоторых случаях может иметь смысл использовать протокол; в других - структура; в других вы можете захотеть и то, и другое). Вы можете создать шаблон «язык», не ограничивая себя миром, в котором вы создаете дополнительные протоколы только потому, что «это шаблон».