Основные связанные типы и типизированные ошибки
Ограничивайте экзистенциальные типы протоколов и разбирайтесь в типизированной передаче ошибок 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 — локальная установка не требуется.
Все уроки этого курса
- Ограничения обобщений и предложения where
- Непрозрачные типы с ключевым словом some
- Экзистенциальные типы с any и стирание типа
- Основные связанные типы и типизированные ошибки