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