0Pricing
Swift Academy · Урок

Ограничения (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 — локальная установка не требуется.

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

  1. Обобщённые функции и типы
  2. Ограничения (where), выведение типов
  3. Обобщённые алгоритмы для коллекций
← Назад к Swift Academy