Выбор ответа Middle Протоколы, POP и дженерики спрашивают часто обновлено

Разница между some и any в Swift

Вопрос

Чем func makeShape() -> some Shape отличается от func makeShape() -> any Shape?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: some скрывает один конкретный тип, а any это коробка для любого типа. Opaque-тип some Shape означает «конкретный тип, который я не называю»: функция всегда возвращает один и тот же тип, компилятор его знает и может оптимизировать.

Варианты ответа

  1. Ничем: some это устаревший синоним any, оставленный для SwiftUI
  2. some разрешает возвращать разные типы в разных ветках функции
  3. some скрывает один конкретный тип, а any это коробка для любого типаправильный ответ
  4. any работает быстрее, потому что не требует специализации кода

Разбор

Opaque-тип some Shape означает «конкретный тип, который я не называю»: функция всегда возвращает один и тот же тип, компилятор его знает и может оптимизировать. Поэтому вернуть Circle в одной ветке и Square в другой нельзя. any Shape это existential: значение упаковывается в контейнер, методы вызываются через witness table, типы могут быть разными. Обычно any медленнее, а не быстрее. some не устарел, это основа SwiftUI (some View).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.