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

Протокол с associatedtype как тип параметра

Вопрос

Как принять в функцию любую коллекцию целых чисел, сохранив статическую типизацию и скорость?

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

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

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

Коротко

Правильный ответ: func sum( xs: some Collection<Int) - Int. У Collection есть associatedtype Element, и голое имя Collection в позиции типа не компилируется.

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

  1. func sum(_ xs: some Collection<Int>) -> Intправильный ответ
  2. func sum(_ xs: Collection) -> Int where Element == Int
  3. func sum(_ xs: [Any]) -> Int
  4. func sum(_ xs: AnyObject) -> Int

Разбор

У Collection есть associatedtype Element, и голое имя Collection в позиции типа не компилируется. С Swift 5.7 у протоколов бывают первичные associated types, поэтому можно писать some Collection<Int> (то же, что дженерик <C: Collection> с where C.Element == Int). [Any] теряет тип элементов и потребует приведения, AnyObject вообще про классы.

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

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