В Swift протоколы — это мощный инструмент, который позволяет разработчикам создавать гибкий, повторно используемый и масштабируемый код. Они играют ключевую роль в достижении абстракции и обеспечении полиморфизма — основных принципов объектно-ориентированного программирования (ООП). В этом блоге мы погрузимся в мир протоколов Swift, изучим их особенности и преимущества и продемонстрируем, как их можно использовать для разработки надежного и адаптируемого кода на практических примерах.
Это сообщение было первоначально опубликовано по адресуhttps://mahigarg.github.io/blogs/protocols-in-swift/ , а затем повторно опубликовано на Medium.
Что такое протоколы?
Протоколы в Swift похожи на интерфейсы в других языках программирования. Они определяют схему методов, свойств и других требований, которые должен принять класс или структура. Класс или структура, соответствующие протоколу, обещают обеспечить реализацию всех требований, определенных в этом протоколе.
Объявление протоколов
Начнем с создания простого протокола, определяющего требования к объекту, способному издавать звук:
protocol SoundMaker { func makeSound() }
В этом примере мы объявили протокол SoundMaker с единственным требованием: метод makeSound().
Принятие протоколов
Теперь давайте создадим два класса, использующие протокол SoundMaker:
class Dog: SoundMaker { func makeSound() { print("Woof woof!") } } class Cat: SoundMaker { func makeSound() { print("Meow!") } }
Оба класса Dog и Cat реализуют метод makeSound(), как того требует протокол SoundMaker.
Использование протоколов
Теперь, когда у нас есть классы, соответствующие протоколу SoundMaker, мы можем использовать тип протокола для создания коллекции различных объектов, создающих звук:
let dog = Dog() let cat = Cat() let soundMakers: [SoundMaker] = [dog, cat] for soundMaker in soundMakers { soundMaker.makeSound() }
Результатом будет:
Woof woof! Meow!
Свойства протокола
Протоколы также могут требовать реализации свойств. Давайте изменим наш протокол SoundMaker, включив в него свойство name:
protocol SoundMaker { var name: String { get } func makeSound() }