Выбор ответа Senior Протоколы, POP и дженерики обновлено

Требование Self в протоколе

Вопрос

Почему до Swift 5.7 нельзя было объявить переменную типа Equatable, а сейчас можно any Equatable, но сравнить два таких значения через == всё равно нельзя?

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

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

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

Коротко

Правильный ответ: == требует два значения одного типа Self, а типы могут различаться. Требование static func == (lhs: Self, rhs: Self) - Bool использует Self.

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

  1. Equatable помечен как @frozen, и existential для него нельзя открыть в коде
  2. any отключает все методы протокола, кроме свойств
  3. == требует два значения одного типа Self, а типы могут различатьсяправильный ответ
  4. Сравнение existential запрещено ради потокобезопасности

Разбор

Требование static func == (lhs: Self, rhs: Self) -> Bool использует Self. Для двух existential компилятор не знает, совпадают ли конкретные типы. SE-0309 разрешил existential для таких протоколов, но методы с Self в позиции параметра недоступны напрямую. Решение: открыть existential через дженерик-функцию или сравнивать через AnyHashable. any не отключает остальные методы, а @frozen про ABI.

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

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