Ограничения параметров типов
Требуйте соответствия протоколам от обобщённых параметров.
«Ограничения параметров типов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Ограничения параметров типов
- Предложения where в функциях
- Ограничение ассоциированных типов
- Обобщённые индексы и расширения