0Pricing
Swift Academy · Урок

Условное соответствие протоколам

Обеспечивайте соответствие обобщённого типа протоколу только если его параметр типа удовлетворяет ограничениям (например, Box<T>: Equatable where T: Equatable ).

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

Зачем нужно условное соответствие?

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

Основы обобщённого типа

Начните с обобщённого типа. Без дополнительной работы Box не соответствует протоколам сопоставимости/хешируемости, даже если им соответствует T.

struct Box<T> {
    var value: T
}
let bi = Box(value: 3)
let bs = Box(value: "hi")
// At this point Box has no Equatable/Hashable, regardless of T.

Условная сопоставимость

Добавляйте сопоставимость только при условии T: Equatable. Код, сравнивающий контейнеры с несопоставимыми типами, не скомпилируется, что обеспечивает безопасность.

extension Box: Equatable where T: Equatable {
    static func == (lhs: Box<T>, rhs: Box<T>) -> Bool {
        lhs.value == rhs.value
    }
}
print(Box(value: 5) == Box(value: 5))   // true
// Works because Int is Equatable
// print(Box(value: someNonEquatable) == ...) // won't compile

Условная хешируемость

Аналогично, добавляйте хешируемость только тогда, когда элемент поддерживает Hashable. Тогда Set/Dictionary работают с Box<T>.

extension Box: Hashable where T: Hashable {
    func hash(into hasher: inout Hasher) {
        hasher.combine(value)
    }
}
let set: Set<Box<Int>> = [Box(value: 1), Box(value: 1)]
print(set.count)  // 1 because Hashable is available only when T: Hashable

Ограничение возможностей с помощью условий

Используйте расширения с ограничениями, чтобы открывать методы только для определённых возможностей (например, при условии T: Numeric), сохраняя базовый интерфейс небольшим.

// Add extra APIs only when T supports them
extension Box where T: Numeric {
    func doubled() -> T { value + value }
}
print(Box(value: 7).doubled())     // 14 (Int is Numeric)
// Box(value: "hi").doubled()      // won't compile — String not Numeric

Пример из стандартной библиотеки

Вы уже ежедневно используете этот подход:

  • Массив: сопоставимость — только когда Element: Equatable;
  • Словарь/множество — хеширование только когда ключи или элементы имеют тип Hashable;
  • Необязательное значение — равенство только когда Wrapped: Equatable.

Преимущество: интерфейсы точны и безопасны на этапе компиляции.

Проверка определения

Быстрая проверка: что позволяет условное соответствие?

Повторение

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

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

Урок «Условное соответствие протоколам» бесплатный?

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

Чему я научусь в уроке «Условное соответствие протоколам»?

Обеспечивайте соответствие обобщённого типа протоколу только если его параметр типа удовлетворяет ограничениям (например, Box<T>: Equatable where T: Equatable ). Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

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

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

Сколько времени занимает урок «Условное соответствие протоколам»?

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

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

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

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

  1. Условное соответствие протоколам
  2. Рекурсивные ограничения и обобщения высшего порядка
  3. Условия where в расширениях
← Назад к Swift Academy