Swift Academy · Урок

Непрозрачные типы с ключевым словом some

Возвращайте из функций непрозрачные типы, сохраняя идентичность типа без её раскрытия.

Урок 2 из 413 шагов

«Непрозрачные типы с ключевым словом 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 match

some и any

some — непрозрачный тип (один фиксированный тип), а any — экзистенциальный тип (любой соответствующий тип во время выполнения).

func withSome() -> some Shape { Circle() }  // opaque
func withAny() -> any Shape { Circle() }   // existential

some в теле 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 эквивалентен (_ value: T). Компилятор выводит 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 — локальная установка не требуется.

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

  1. Ограничения обобщений и предложения where
  2. Непрозрачные типы с ключевым словом some
  3. Экзистенциальные типы с any и стирание типа
  4. Основные связанные типы и типизированные ошибки
← Назад к Swift Academy