Условия where в расширениях
Используйте where в расширениях типов и протоколов , чтобы добавлять API только при выполнении ограничений (например, Array where Element: Equatable , Collection where Element == Int ).
«Условия where в расширениях» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Зачем нужны расширения с ограничениями?
Добавляйте интерфейсы только при выполнении ограничений типов, задавая условия в расширениях:
- расширения типов (например,
Array); - расширения протоколов (например,
Collection); - ограничения на точное совпадение (например,
Element == Int).
Расширение типа с ограничением
Добавляйте методы к массиву только когда его Element поддерживает сопоставимость. Массивы с несопоставимыми элементами не будут видеть эти интерфейсы.
extension Array where Element: Equatable {
func removing(_ value: Element) -> [Element] {
filter { $0 != value }
}
func containsAll(_ others: [Element]) -> Bool {
others.allSatisfy(self.contains)
}
}
print([1,2,3].removing(2)) // [1,3]
print(["a","b"].containsAll(["b"])) // trueРасширение протокола с условием
Расширение протокола добавляет интерфейс ко всем соответствующим типам, когда выполняется ограничение (здесь — к любой Collection с элементами, поддерживающими сравнимость).
extension Collection where Element: Comparable {
var isSorted: Bool {
// Pair each element with the next; ensure non-decreasing order
zip(self, dropFirst()).allSatisfy(<=)
}
}
print([1,2,3].isSorted) // true
print([3,1,2].isSorted) // falseОграничения на точное совпадение
Используйте ограничения равенства для целевых интерфейсов, например только при условии Element == Int. Для других типов элементов они недоступны.
extension Collection where Element == Int {
var sum: Int { reduce(0, +) }
func average() -> Double {
isEmpty ? 0 : Double(sum) / Double(count)
}
}
print([1,2,3].sum) // 6
print([1,2,3].average()) // 2.0Интерфейсы на основе возможностей
Задавайте ограничения по возможности (протоколам вроде Numeric и Hashable), чтобы составлять мощные повторно используемые вспомогательные средства.
extension Collection where Element: Numeric {
var total: Element { reduce(0, +) }
}
extension Sequence where Element: Hashable {
var uniques: [Element] {
var seen = Set<Element>()
return filter { seen.insert($0).inserted }
}
}
print([1,2,2,3].uniques) // [1,2,3]
print([1,2,3].total) // 6Примечания по проектированию
Советы:
- Отдавайте предпочтение минимальным ограничениям для более широкого повторного использования.
- Избегайте пересекающихся расширений, определяющих один и тот же член: это может запутать разрешение перегрузки.
- Документируйте предположения (порядок, уникальность, числовые области).
Назначение расширений с ограничениями
Быстрая проверка: что позволяют делать расширения с ограничениями?
Итоги
Итоги: используйте where в расширениях типов и протоколов, чтобы точно нацеливать программные интерфейсы — по возможностям (: Comparable) или точному типу (== Int), сохраняя код безопасным и понятным.
Часто задаваемые вопросы
Урок «Условия where в расширениях» бесплатный?
Да — полный текст урока «Условия where в расширениях» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «Условия where в расширениях»?
Используйте where в расширениях типов и протоколов , чтобы добавлять API только при выполнении ограничений (например, Array where Element: Equatable , Collection where Element == Int ). Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Условия where в расширениях»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Условное соответствие протоколам
- Рекурсивные ограничения и обобщения высшего порядка
- Условия where в расширениях