Могут ли структуры (struct) в Swift реализовывать протоколы?

«Могут ли структуры (struct) в Swift реализовывать протоколы?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, структуры в 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 } }