Extension
• Добавление функционала к классу, структуре, перечислению (как своих типов, так и любых системных)
• Часто используется, когда нет доступа к изменению исходных кодов (системные классы, библиотеки)
• Можно добавлять:
• computed property (stored property нельзя)
• Методы
• init (только convenience), нельзя deinit
• Subscript
• Nested Type
• …
• В Java такого механизма нет (точнее нет простого решения, можно использовать механизм Reflection либо AOP)
Extension
• Имеет доступ к свойствам самого объекта, для которого выполняется расширение
• Если есть доступ к исходному коду – лучше изменить его напрямую, чем создавать много «заплаток»
Наследование
• Extension похож чем-то на наследование – не путайте
• Если нужно добавить большой функционал и выполняется условие «is-a» - лучше создать свой тип и использовать
наследование (неважно, есть доступ к исходному коду или нет, все равно создаем свой новый тип)
Протоколы
• С помощью extensions можно создавать default implementation (дефолтная реализация) для протоколов
• Не нужно создавать базовый класс, чтобы задать реализацию по-умолчанию
• Начиная с Java 8 дефолтная реализация поддерживается сразу внутри интерфейсов (default method)
• Если в классе будет по новому определен метод из extension - будет использоваться метод класса
Домашнее задание
• Прочитать абзац «Adding Protocol Conformance with an Extension»:
• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html
• Прочитать
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html