Стэнфорд о SwiftUI: „Протоколы — это контракты и код-шеринг“

Stanford Online 3,4 тыс. 1 ч 13 мин 2 мин 03.12.2025
Главное

Протоколы в SwiftUI: Контракты, код-шеринг и типы

В девятой лекции курса Stanford CS193p (весна 2025) основной акцент сделан на использовании протоколов как фундаментальной части системы типов Swift. Автор курса подчеркивает, что Swift является «протокол-ориентированным» языком, где протоколы служат не только контрактами для обеспечения функциональности, но и мощным инструментом для управления типами и написания гибкого, переиспользуемого кода.

🧩 Зачем нужны протоколы?

Протоколы в Swift выполняют четыре ключевые роли:

  1. Контракты: Определение набора требований (свойств и методов), которые должен реализовать тип, чтобы выполнять определенную задачу.
  2. Код-шеринг: Расширения (extension) позволяют добавлять реализацию методов непосредственно в протоколы. Таким образом, любой тип, соответствующий протоколу, автоматически получает эту функциональность (именно так устроены все View-модификаторы в SwiftUI).
  3. Система типов: Протоколы могут использоваться как типы переменных, параметров функций или возвращаемых значений.
  4. Constraints and Gains: Сочетание протоколов с ключевыми словами where и extension позволяет создавать мощные ограничения для дженериков (как, например, ограничение для ключей в Dictionary на соответствие Hashable).

🛠 Ключевые слова some и any

При использовании протоколов в качестве типов критически важно понимать разницу между some и any:

⚙️ Три фундаментальных протокола: Equatable, Hashable, Identifiable

Эти протоколы играют ключевую роль в работе SwiftUI:

🧱 Переход к @Observable и классам

Автор анонсирует сдвиг в архитектуре модели: переход от структур к классам с использованием макроса @Observable.

💬 Цитаты

«Swift — это протокол-ориентированный язык.»

«some значительно предпочтительнее any. Если вы думаете, что вам нужно использовать any, свяжитесь со мной.»

👥 Спикер
📖 Термины
some
Ключевое слово для скрытия конкретного типа, при этом компилятор знает, какой тип используется.
any
Ключевое слово, позволяющее использовать массив типов, реализующих один протокол, с разрешением типов в runtime.
Boxing
Механизм „упаковки“ конкретного типа в контейнер при использовании any, чтобы позволить системе работать с разными типами в одном массиве.
Inout
Параметр функции, который передается внутрь, может быть изменен и возвращается обратно, фактически позволяя изменять переданную переменную.
Synthesized
Автоматическая генерация компилятором реализации протоколов (например, Equatable или Hashable) на основе данных типа.
📊 Цифры
⚖️ Другая сторона
Образование SwiftUI Swift protocols Observable