0Pricing
Swift Academy · Урок

Основные связанные типы и типизированные ошибки

Ограничивайте экзистенциальные типы протоколов и разбирайтесь в типизированной передаче ошибок Swift 6.

«Основные связанные типы и типизированные ошибки» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Основные связанные типы

Swift 5.7 позволяет указывать основные связанные типы в протоколах, благодаря чему можно использовать ограниченные экзистенциальные типы.

protocol Container<Element> {
  associatedtype Element
  var items: [Element] { get }
}
struct Bag<T>: Container { var items: [T] = [] }

Ограниченные экзистенциальные типы

С основными связанными типами можно записать any Container, чтобы сузить экзистенциальный тип.

func printItems(_ c: any Container<Int>) {
  c.items.forEach { print($0) }
}
printItems(Bag(items: [1,2,3]))

Экзистенциальные типы с ограничениями для коллекций

Протоколы стандартной библиотеки, например Collection, теперь поддерживают основные связанные типы.

func first(_ c: any Collection<String>) -> String? {
  c.first
}
print(first(["a","b","c"]) ?? "none")

Введение в типизированные ошибки

Swift 6 вводит типизированные ошибки, позволяющие объявить точный тип ошибки, которую может выбросить функция.

enum NetworkError: Error { case timeout, notFound }
func fetch() throws(NetworkError) -> Data {
  throw NetworkError.timeout
}

Исчерпывающая обработка типизированных ошибок

Поскольку тип ошибки известен, компилятор может проверить, что обработаны все возможные случаи.

do {
  let _ = try fetch()
} catch .timeout {
  print("Timed out")
} catch .notFound {
  print("Not found")
}

Типизированные ошибки в протоколах

Требования протокола могут указывать тип выбрасываемой ошибки, позволяя соответствующим типам предоставлять точные типы ошибок.

protocol Fetchable {
  associatedtype Failure: Error
  func fetch() throws(Failure) -> Data
}

Повторная передача типизированных ошибок

rethrows работает с типизированными ошибками: внешняя функция передаёт тип внутренней ошибки дальше.

func map<T, E: Error>(_ array: [T], transform: (T) throws(E) -> T) throws(E) -> [T] {
  try array.map { try transform($0) }
}

Сочетание основных AT с типизированными ошибками

Обе возможности можно использовать вместе для создания точных и типобезопасных API.

protocol Repository<Model> {
  associatedtype Model
  associatedtype Failure: Error
  func fetchAll() throws(Failure) -> [Model]
}

Непрозрачные типизированные ошибки

throws(any Error) эквивалентно нетипизированному выбрасыванию ошибок и предоставляет запасной вариант.

func riskyOp() throws(any Error) {
  // can throw any error
}

Переход от нетипизированных к типизированным ошибкам

Переход выполняется поэтапно: добавляйте к существующим функциям, выбрасывающим ошибки, конкретный тип ошибки.

// Before:
func load() throws -> Data { ... }
// After:
func load() throws(NetworkError) -> Data { ... }

Типизированные ошибки и асинхронность

Типизированные ошибки естественно сочетаются с асинхронным кодом: async throws(E) является допустимым синтаксисом.

func fetchAsync() async throws(NetworkError) -> Data {
  throw NetworkError.notFound
}

Быстрая проверка

Что позволяют использовать основные связанные типы в протоколе?

Итоги урока

Основные связанные типы (Swift 5.7) позволяют использовать ограниченные экзистенциальные типы, например any Collection. Типизированные ошибки (Swift 6) позволяют объявлять точные типы ошибок для блоков с исчерпывающей обработкой. Обе возможности повышают типобезопасность и выразительность API.

Часто задаваемые вопросы

Урок «Основные связанные типы и типизированные ошибки» бесплатный?

Да — полный текст урока «Основные связанные типы и типизированные ошибки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основные связанные типы и типизированные ошибки»?

Ограничивайте экзистенциальные типы протоколов и разбирайтесь в типизированной передаче ошибок Swift 6. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Основные связанные типы и типизированные ошибки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Ограничения обобщений и предложения where
  2. Непрозрачные типы с ключевым словом some
  3. Экзистенциальные типы с any и стирание типа
  4. Основные связанные типы и типизированные ошибки
← Назад к Swift Academy