Можно ли объявить свойство (property) в протоколе Swift?

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

Ответ

Да, в протоколе Swift можно объявить требование для свойства, указав его имя, тип и уровень доступа (get или get set). Саму реализацию (stored или computed property) предоставляет тип, соответствующий протоколу.

// Объявление требований к свойствам в протоколе
protocol Identifiable {
    var id: String { get } // Только на чтение
    var displayName: String { get set } // На чтение и запись
    static var typeName: String { get } // Статическое свойство
}

// Соответствие протоколу
struct User: Identifiable {
    // Можно реализовать как stored property
    let id: String
    // Можно реализовать как computed property
    var displayName: String {
        get { "User_(id)" }
        set { /* логика установки */ }
    }
    // Статическое свойство
    static let typeName: String = "User"
}

Ключевые моменты:

  • { get } означает, что свойство должно быть как минимум доступно для чтения. Его можно реализовать как константу (let), переменную (var) или вычисляемое свойство только для чтения.
  • { get set } требует, чтобы свойство было изменяемым. Его нельзя реализовать как let константу.
  • Требуемый тип должен точно соответствовать (например, var id: String? не удовлетворит требованию var id: String).