Ответ
Протоколы в Swift могут определять разнообразные требования (requirements):
-
Требования к свойствам: Указывается имя, тип и должны ли свойства быть доступны только для чтения (
{ get }) или для чтения и записи ({ get set }).protocol Identifiable { var id: String { get } static var typeName: String { get } } -
Требования к методам: Могут быть экземплярными (
func doWork()) и статическими (static func create()). Поддерживаютсяmutatingметоды иthrows. -
Требования к инициализаторам:
protocol Initializable { init(from decoder: Decoder) throws } -
Требования к сабскриптам:
protocol ListRepresentable { subscript(index: Int) -> String { get set } } -
Ассоциированные типы (Associated Types): Позволяют создавать обобщенные (generic) протоколы. Тип указывается при реализации.
protocol Container { associatedtype Element var items: [Element] { get } mutating func add(_ item: Element) } -
Опциональные требования: Доступны только для протоколов, помеченных
@objc. Реализация таких требований не обязательна.@objc protocol OptionalProtocol { @objc optional func mightNotBeImplemented() var optionalProperty: String? { get @objc optional } }
Протокол определяет что должно быть реализовано, но не как. Соответствующий тип (класс, структура, перечисление) обязан предоставить конкретную реализацию всех неопциональных требований.