Как правильно использовать расширения классов в Swift?

В 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 в мире смотрит на расширения. Как вы думаете? Есть ли серебряная пуля?

Ответы на вопрос(1)

Ваш ответ на вопрос