Требование Self в протоколе
Вопрос
Почему до Swift 5.7 нельзя было объявить переменную типа Equatable, а сейчас можно any Equatable, но сравнить два таких значения через == всё равно нельзя?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
Equatableпомечен как@frozen, и existential для него нельзя открыть в кодеanyотключает все методы протокола, кроме свойств==требует два значения одного типаSelf, а типы могут различатьсяправильный ответ- Сравнение existential запрещено ради потокобезопасности
Разбор
Требование static func == (lhs: Self, rhs: Self) -> Bool использует Self. Для двух existential компилятор не знает, совпадают ли конкретные типы. SE-0309 разрешил existential для таких протоколов, но методы с Self в позиции параметра недоступны напрямую. Решение: открыть existential через дженерик-функцию или сравнивать через AnyHashable. any не отключает остальные методы, а @frozen про ABI.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Ретроактивное соответствие и @retroactive
Следующий вопрос
Разница между some и any в Swift
Термины по теме
Ещё по теме «Протоколы, POP и дженерики»
- Протокол делегата и weak
- Протокол с associatedtype как тип параметра
- Условное соответствие протоколу
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift