Ответ
Да, структуры в Swift могут реализовывать протоколы, как и классы или перечисления. Это один из основных способов обеспечения полиморфизма для value-типов.
Пример:
protocol Renderable {
func draw() -> String
}
struct Circle: Renderable {
var radius: Double
func draw() -> String {
return "Рисую круг с радиусом (radius)"
}
}
struct Square: Renderable {
var side: Double
func draw() -> String {
return "Рисую квадрат со стороной (side)"
}
}
// Использование полиморфизма
let shapes: [Renderable] = [Circle(radius: 5.0), Square(side: 3.0)]
for shape in shapes {
print(shape.draw())
}
Особенности для структур:
- Value-семантика: При присваивании или передаче в функцию структура копируется, но её соответствие протоколу сохраняется.
- Мутирующие методы: Если метод протокола должен изменять свойства структуры, он должен быть помечен как
mutating. Реализация в структуре также требует ключевого словаmutating.protocol Resizable { mutating func scale(by factor: Double) }
struct Rectangle: Resizable { var width, height: Double mutating func scale(by factor: Double) { width = factor height = factor } }