Непрозрачные типы с ключевым словом some
Возвращайте из функций непрозрачные типы, сохраняя идентичность типа без её раскрытия.
«Непрозрачные типы с ключевым словом some» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Проблема, которую решают непрозрачные типы
Возврат типа протокола с any приводит к потере информации о типе. some сохраняет её, скрывая реализацию.
protocol Shape { var area: Double { get } }
struct Circle: Shape { var area: Double { .pi * 4 } }Возврат some Protocol
some Shape в качестве возвращаемого типа сообщает вызывающему коду: «возвращается конкретный тип Shape», не раскрывая, какой именно.
func makeShape() -> some Shape {
return Circle()
}
let s = makeShape()
print(s.area)Идентичность типа сохраняется
Поскольку у типов some есть фиксированный базовый тип, компилятор разрешает операции, требующие Self.
func makeEquatableShape() -> some Shape & Equatable {
return Circle()
}
let a = makeEquatableShape()
let b = makeEquatableShape()
print(a == b) // works because types matchsome и any
some — непрозрачный тип (один фиксированный тип), а any — экзистенциальный тип (любой соответствующий тип во время выполнения).
func withSome() -> some Shape { Circle() } // opaque
func withAny() -> any Shape { Circle() } // existentialsome в теле SwiftUI
SwiftUI использует some View, чтобы тело каждого представления возвращало один согласованный тип, не раскрывая внутреннее устройство компоновки.
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}Непрозрачные параметры с some
Swift 5.7+ позволяет использовать some Protocol в позициях параметров как синтаксический сахар для ограничений обобщений.
func printArea(_ shape: some Shape) {
print(shape.area)
}
printArea(Circle())Обратная запись обобщений
Непрозрачный параметр some P эквивалентен . Компилятор выводит T в месте вызова.
func doubled(_ value: some Numeric) -> some Numeric {
value * 2
}Ограничения для some
Вы можете составлять протоколы с непрозрачными типами так же, как и с обобщениями.
func process(_ item: some Codable & Hashable) {
let hash = item.hashValue
print(hash)
}Возврат разных типов
В отличие от экзистенциальных типов, с непрозрачными типами нельзя возвращать разные соответствующие типы из разных ветвей.
// This would NOT compile:
// func shape(_ big: Bool) -> some Shape {
// big ? Circle() : Square() // ERROR: different types
// }Непрозрачные типы в протоколах
Протоколы со связанными типами проще использовать в качестве возвращаемых типов с помощью some.
protocol Buildable { associatedtype Output; func build() -> Output }
func build(_ b: some Buildable) -> some Any {
b.build()
}Когда выбирать some
Предпочитайте some, когда возвращаете один согласованный тип и хотите сохранить его идентичность. Используйте any, когда нужны неоднородные коллекции.
var shapes: [any Shape] = [Circle(), Circle()]
let single: some Shape = Circle()Быстрая проверка
Что ключевое слово some гарантирует относительно возвращаемого типа?
Повторение урока
some создаёт непрозрачные возвращаемые типы, скрывающие конкретный тип, но сохраняющие идентичность типа. some View в SwiftUI — классический пример. Используйте some для возвращаемых значений одного типа, а any — для неоднородных коллекций.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Непрозрачные типы с ключевым словом some» бесплатный?
Да — полный текст урока «Непрозрачные типы с ключевым словом some» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Непрозрачные типы с ключевым словом some»?
Возвращайте из функций непрозрачные типы, сохраняя идентичность типа без её раскрытия. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Непрозрачные типы с ключевым словом some»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Ограничения обобщений и предложения where
- Непрозрачные типы с ключевым словом some
- Экзистенциальные типы с any и стирание типа
- Основные связанные типы и типизированные ошибки