Можно ли использовать дженериковый протокол как тип в Swift и какие есть ограничения
Что проверяют
Понимаете ли вы разницу между обобщением через параметр типа и протоколом с associatedtype, и знаете ли, что здесь изменилось начиная со Swift 5.7. Следом обычно спрашивают, чем some P отличается от any P и когда всё ещё нужен ручной ластик типов.
Как отвечать
Сразу снимите путаницу: параметризованных протоколов в Swift нет, «дженериковость» это associatedtype.
associatedtype: заглушка типа, которую конкретизирует реализация, явно или выводом;any Container: экзистенциальный тип, коробка с динамической диспетчеризацией. До Swift 5.7 протокол сassociatedtypeнельзя было написать как тип вообще: компилятор отвечал «can only be used as a generic constraint»;some Container: непрозрачный тип, компилятор знает конкретный тип под ним и сохраняет статическую диспетчеризацию;- primary associated types (Swift 5.7): объявление
protocol Container<Item>разрешаетany Container<Int>, то есть массив[any Container<Int>]уже собирается.
Что не работает и сейчас: у any Container без уточнённого Item нельзя вызвать метод, где ассоциированный тип стоит в параметре, на месте вызова он неизвестен. Требования на Self (Equatable) сжимают экзистенциал ещё сильнее.
Обходные пути: неявное раскрытие экзистенциала (SE-0352), когда any Container передают в func use<C: Container>(_ c: C) и компилятор сам достаёт конкретный тип; ручной ластик AnyContainer на замыканиях по образцу AnySequence; enum, если набор реализаций закрыт.
Добавьте про цену: экзистенциал это боксинг, значение больше трёх машинных слов уезжает в кучу, вызовы идут через таблицу свидетелей. Правило: some по умолчанию, any когда нужна гетерогенная коллекция или тип выбирается в рантайме.
Где спотыкаются
Отвечают по правилам Swift 5.6: «нельзя использовать как тип» и точка. Про any и primary associated types не слышали, а вопрос ровно про это.
Считают some и any синонимами. Первое это один конкретный тип, скрытый от вызывающего, второе коробка, внутри которой может быть другой тип.
Ставят any там, где хватило бы дженерика, и не понимают, почему пропала половина методов протокола.