Ограничения (where), выведение типов
Ограничивайте обобщённый код с помощью where (например, ограничений Equatable/Comparable или Element) и смотрите, как Swift выводит обобщённые типы в местах вызова.
«Ограничения (where), выведение типов» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Зачем нужны ограничения
Добавляйте ограничения, чтобы обобщённый код мог использовать определённые операции, например == или <. Затем вывод типов Swift выбирает конкретные типы при вызовах.
Ограничение равенства
Ограничение на равенство типов разрешает проверки равенства. Без него операция == недоступна для произвольного T.
// Find the first index of value in an array of T
func indexOf<T>(_ value: T, in array: [T]) -> Int? where T: Equatable {
for (i, x) in array.enumerated() {
if x == value { return i } // allowed because T: Equatable
}
return nil
}
print(indexOf(3, in: [1,2,3,2]) ?? -1) // 2
print(indexOf("b", in: ["a","b","c"]) ?? -1) // 1Ограничение сравнимости
Ограничение на сравнимость позволяет выполнять операции упорядочивания, например <.
// Return the minimum value of a collection when elements are Comparable
func minimum<T: Comparable>(_ xs: [T]) -> T? {
guard var best = xs.first else { return nil }
for x in xs.dropFirst() {
if x < best { best = x }
}
return best
}
print(minimum([7,3,9]) ?? -1) // 3
print(minimum(["b","a","c"]) ?? "?") // "a"Расширение с условием
Используйте условие для типа элемента, чтобы добавлять программные интерфейсы только для определённых типов элементов — в данном случае для массивов, элементы которых можно сравнивать на равенство.
// Add a helper only when the array's Element is Equatable
extension Array where Element: Equatable {
func removingDuplicates() -> [Element] {
var seen: [Element] = []
for x in self {
if !seen.contains(x) { seen.append(x) }
}
return seen
}
}
print([1,2,2,3].removingDuplicates()) // [1,2,3]Несколько ограничений
Объединяйте ограничения: ограничивайте обобщённый тип и его связанные типы, например тип элемента последовательности должен поддерживать проверку равенства.
// Require both Sequence and Equatable elements; force same-type relationship
func allEqual<S>(_ s: S) -> Bool
where S: Sequence, S.Element: Equatable {
var it = s.makeIterator()
guard let first = it.next() else { return true }
while let v = it.next() { if v != first { return false } }
return true
}
print(allEqual([2,2,2])) // true
print(allEqual([1,2,1])) // falseВывод типов на практике
Swift выводит обобщённые параметры из аргументов и контекста, поэтому при вызовах редко требуется явно указывать <T>.
// Inference: compiler deduces concrete types
let i = indexOf(10, in: [5,10,15]) // T is Int
let j = minimum(["z","x"]) // T is String
print(i ?? -1, j ?? "")Значение условия
Быстрая проверка: что делает предложение с дополнительным условием?
Итоги
Итоги: задавайте ограничения для обобщений с помощью условий (например, T должен поддерживать проверку равенства, а Element — сравнение) и полагайтесь на вывод типов Swift при выборе конкретных типов во время вызовов.
Часто задаваемые вопросы
Урок «Ограничения (where), выведение типов» бесплатный?
Да — полный текст урока «Ограничения (where), выведение типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Ограничения (where), выведение типов»?
Ограничивайте обобщённый код с помощью where (например, ограничений Equatable/Comparable или Element) и смотрите, как Swift выводит обобщённые типы в местах вызова. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Ограничения (where), выведение типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обобщённые функции и типы
- Ограничения (where), выведение типов
- Обобщённые алгоритмы для коллекций