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

Специализация дженериков

Вопрос

Почему дженерик-функция из другого модуля может работать медленнее, чем такая же внутри модуля?

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

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

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

Коротко

Правильный ответ: Без @inlinable тело функции не видно клиенту, и она не специализируется. Компилятор специализирует дженерик под конкретный тип (как шаблон C++), если видит тело функции.

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

  1. Дженерики между модулями всегда упаковывают аргументы в Any
  2. Межмодульные вызовы дженериков проходят через Objective-C runtime
  3. Дженерики специализируются только в отладочной сборке клиента
  4. Без @inlinable тело функции не видно клиенту, и она не специализируетсяправильный ответ

Разбор

Компилятор специализирует дженерик под конкретный тип (как шаблон C++), если видит тело функции. Внутри модуля это так, а снаружи по умолчанию видна только сигнатура, и вызов идёт через неспециализированную версию с передачей метаданных типа. @inlinable публикует тело в интерфейс модуля. Упаковки в Any и Objective-C тут нет.

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

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