В Swift я исторически использовал расширения для расширения закрытых типов и обеспечения удобных, не связанных с логикой функций, таких как анимации, математические расширения и т.д. Однако, поскольку расширения представляют собой жесткие зависимости, разбросанные по всей вашей кодовой базе, я всегда думаю три раза перед реализацией что-то как расширение.
В последнее время, однако, я видел, что Apple предлагает использовать расширения в еще большей степени, например, реализация протоколов как отдельных расширений.
То есть, если у вас есть класс A, реализующий протокол B, вы получите такой дизайн:
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
Когда вы входите в эту кроличью нору, я начал видеть больше кода на основе расширений, например:
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
Одна часть меня любит строительные блоки, которые вы получаете при реализации протоколов в отдельных расширениях. Это делает отдельные части класса действительно отличными. Однако, как только вы унаследуете этот класс, вам придется изменить этот дизайн, поскольку функции расширения не могут быть переопределены.
Я думаю, что второй подход... интересен. Замечательно, что вам не нужно аннотировать каждое частное свойство и выполнять функцию частного, поскольку вы можете указать это для расширения.
Однако этот дизайн также разделяет хранимые и несохраненные свойства, публичные и приватные функции, что усложняет "логику" класса (я знаю, пишу меньшие классы). Это, вместе с проблемами подклассов, заставляет меня немного остановиться на крыльце страны чудес расширения.
Хотелось бы услышать, как сообщество Swift в мире смотрит на расширения. Как вы думаете? Есть ли серебряная пуля?