0Pricing
Swift Academy · Урок

Ограничения параметров типов

Требуйте соответствия протоколам от обобщённых параметров.

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

Итоги обобщений

Обобщённая функция использует параметр типа, например <T>, поэтому работает со множеством типов. Но неограниченный T можно только передавать дальше, не исследуя его. Ограничения открывают доступ к дополнительным возможностям.

func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))

Ограничение Comparable

Запись <T: Comparable> гарантирует, что значения T поддерживают <, > и другие подобные операции, поэтому их можно сравнивать.

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
    a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))

Зачем нужны ограничения

Без Comparable компилятор отклонит a > b, потому что его поддерживают не все типы. Ограничение — это обещание, делающее операцию допустимой.

func minOf<T: Comparable>(_ list: [T]) -> T? {
    list.min()
}
print(minOf([4, 2, 8])!)

Ограничение Equatable

Equatable предоставляет операции == и !=. Используйте его, чтобы подсчитывать или находить совпадающие элементы.

func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
    list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))

Ограничение Hashable

Hashable позволяет использовать значения как элементы Set или ключи словаря.

func unique<T: Hashable>(_ list: [T]) -> [T] {
    Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())

Ограничения протоколами

Любой протокол может выступать в роли ограничения. Здесь пользовательский протокол открывает доступ к своему методу через параметр типа.

protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }

func announce<T: Speaker>(_ x: T) {
    print(x.speak())
}
announce(Dog())

Ограничения для классов

Можно потребовать, чтобы T наследовался от определённого класса, получив доступ к членам этого класса.

class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }

func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())

Несколько ограничений

Объединяйте ограничения с помощью &, чтобы одновременно потребовать соответствия нескольким протоколам.

func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
    print(a.description, a == b)
}
show(5, 5)

Несколько параметров типов

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

func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
    var d: [K: V] = [:]
    for (k, v) in zip(keys, vals) { d[k] = v }
    return d
}
print(zipMap(["a", "b"], [1, 2]))

Ограничения для типов

Обобщённые типы, а не только функции, также принимают ограничения. Обобщённая структура может требовать, чтобы её параметр соответствовал протоколу.

struct SortedBox<T: Comparable> {
    var items: [T]
    var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)

Числовые ограничения

Стандартные протоколы, например Numeric, позволяют generic-коду выполнять арифметические операции с Int, Double и другими типами.

func sum<T: Numeric>(_ list: [T]) -> T {
    list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))

Проверка понимания

Проверьте, насколько хорошо Вы поняли ограничения параметров типов.

Итоги

Ограничения параметров типов (<T: Protocol> или <T: SomeClass>) сообщают компилятору, что может делать обобщённый тип. Вы рассмотрели Comparable, Equatable, Hashable, Numeric, пользовательские протоколы, ограничения для классов, несколько ограничений с помощью & и ограничения для обобщённых типов.

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

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

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

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

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

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

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

Сколько времени занимает урок «Ограничения параметров типов»?

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

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

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

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

  1. Ограничения параметров типов
  2. Предложения where в функциях
  3. Ограничение ассоциированных типов
  4. Обобщённые индексы и расширения
← Назад к Swift Academy