0Pricing
Swift Academy · Урок

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

Научитесь заставлять обобщённые типы условно соответствовать протоколам с помощью предложений where.

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

Введение

Условное соответствие позволяет обобщённому типу соответствовать протоколу только тогда, когда его параметры типа удовлетворяют определённым ограничениям. Это одна из основ выразительности системы типов Swift.

Основы условного соответствия

```swift extension Array: Equatable where Element: Equatable { // Array is Equatable only when Element is Equatable } let a = [1,2,3] let b = [1,2,3] print(a == b) // true — works because Int is Equatable ```

Пользовательский обобщённый тип

```swift struct Box { var value: T } extension Box: Equatable where T: Equatable { static func == (lhs: Box, rhs: Box) -> Bool { lhs.value == rhs.value } } print(Box(value: 42) == Box(value: 42)) // true ```

Условное соответствие Hashable

```swift extension Box: Hashable where T: Hashable { func hash(into hasher: inout Hasher) { hasher.combine(value) } } // Box is Hashable; Box is not ```

Условное соответствие Codable

```swift extension Box: Codable where T: Codable {} let box = Box(value: "hello") let data = try JSONEncoder().encode(box) // works — String is Codable ```

Условия where в расширениях

```swift extension Collection where Element == Int { var sum: Int { reduce(0, +) } } print([1,2,3,4].sum) // 10 // This extension only applies to collections of Int ```

Множественные ограничения

```swift extension Dictionary where Key: Comparable, Value: Equatable { func sortedByKey() -> [(Key, Value)] { sorted { $0.key < $1.key } } } ```

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

```swift protocol Printable { func prettyPrint() } extension Optional: Printable where Wrapped: Printable { func prettyPrint() { switch self { case .none: print("nil") case .some(let v): v.prettyPrint() } } } ```

Использование условного соответствия

```swift let opt: Int? = 42 // If Int conformed to Printable: // opt.prettyPrint() // "42" // Standard usage: let nums = Optional([1,2,3]) // [1,2,3]? if let arr = nums, arr == [1,2,3] { ... } // Equatable via conditional ```

Предупреждение о ретроактивном соответствии

В Swift 5.7+ появляется предупреждение о ретроактивных соответствиях — добавлении соответствия типам из другого модуля: ```swift extension String: SomeThirdPartyProtocol {} // ⚠️ retroactive ``` Если это сделано намеренно, явно добавьте `@retroactive`.

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

Какое ключевое слово вводит условие в расширении с условным соответствием?

Итоги

Ключевые выводы: • `extension T: Protocol where Param: Constraint` — условное соответствие • Массивы, Optional, Result и т. д. используют это для Equatable, Hashable и Codable • Пользовательские обобщённые типы могут делать то же самое • `where Element == Int` ограничивает тип конкретными типами • Для ретроактивных соответствий в Swift 5.7+ требуется `@retroactive` Далее: требования Self.

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

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

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

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

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

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

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

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

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

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

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

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

  1. Композиция протоколов с помощью &
  2. Условное соответствие протоколам
  3. Требования Self и проектирование Equatable
  4. Принципы проектирования на основе протоколов
← Назад к Swift Academy